이 오류와 유사한 질문이 이전에 게시되었음을 이해하지만 표 서식 지정과 관련하여 아무것도 발견하지 않았으므로 닫지 마십시오. MS Access 2013의 VBA 코드에서 MS Access에서 Excel로 데이터를 내 보냅니다. 6 개의 쿼리가 각각 다른 워크 시트에있는 하나의 Excel 파일로 내보내집니다. 이것은 잘 작동합니다. 그런 다음 표에 모든 데이터를 포함하도록 각 시트의 서식을 지정합니다. 사용자가 파일을 저장할 경로를 선택할 수있는 양식이 있습니다. 파일을 처음 만드는 경우 제대로 작동합니다. 동일한 디렉토리에 파일을 두 번째로 생성하면 작동하지 않고 오류가 발생합니다.
런타임 오류 1004 : 개체 _Global의 메서드 범위가 실패했습니다.
파일을 삭제하고 다시 만드는 대신 파일을 덮어 쓰기 때문이라고 생각했습니다. 그래서 파일이 있는지 확인하기 위해 일부 코드를 추가하고 존재하는 경우 삭제합니다. 중단 점을 추가하고 코드의이 부분을 실행하는 동안 문서 폴더를보고있었습니다. 파일이 성공적으로 삭제 된 다음 내가 원하는대로 다시 생성되었습니다. 여전히 그 오류가 발생했습니다. 수동으로 파일을 삭제 한 다음 코드를 다시 실행했습니다. 제대로 작동했습니다.
코드를 다시 실행하기 위해이 파일을 수동으로 삭제해야하는 이유는 무엇입니까? 아니면 문제를 일으키는 다른 것이 있습니까? 전체가 게시하기에 너무 길기 때문에 내 코드의 중요한 부분은 다음과 같습니다.
'Checks if a file exists, then checks if it is open
Private Sub checkFile(path As String)
Dim openCheck As Boolean
'If file exists, make sure it isn't open. If it doesn't, create it
If Dir(path) <> "" Then
openCheck = IsFileLocked(path)
If openCheck = True Then
MsgBox "Please close the file in " & path & " first and try again."
End
Else
deleteFile (path)
End If
Else
End If
End Sub
Sub deleteFile(ByVal FileToDelete As String)
SetAttr FileToDelete, vbNormal
Kill FileToDelete
End Sub
Private Sub dumpButton_Click()
On Error GoTo PROC_ERR
Dim path As String
Dim testBool As Boolean
path = pathLabel4.Caption
path = path & Format(Date, "yyyy-mm-dd") & ".xlsx"
checkFile (path)
dumpQueries (path)
formatFile (path)
'Error Handling
PROC_ERR:
If Err.Number = 2001 Then
MsgBox "A file may have been sent to " & path
Exit Sub
ElseIf Err.Number = 2501 Then
MsgBox "A file may have been sent to " & path
Exit Sub
ElseIf Err.Number = 3021 Then
MsgBox "A file may have been sent to " & path
Exit Sub
ElseIf Err.Number = 2302 Then
MsgBox "A file may have been sent to " & path
Exit Sub
ElseIf Err.Number = 0 Then
MsgBox "Your file has been stored in " & pathLabel4.Caption
Exit Sub
Else
MsgBox Err.Number & ": " & Err.Description & vbCrLf & vbCrLf & "New Error. Please contact the IT department."
End If
Private Sub dumpQueries(path As String)
Dim obj As AccessObject, dB As Object
Set dB = Application.CurrentData
For Each obj In dB.AllQueries
testBool = InStr(obj.name, "Sys")
If testBool <> True Then
If obj.name = "example1" Or obj.name = "example2" Then
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, obj.name, path, True, editWorksheetName(obj.name)
End If
End If
Next obj
End Sub
'Autofits the cells in every worksheet
Private Sub formatFile(path As String)
Dim Date1 As Date, strReportAddress As String
Dim objActiveWkb As Object, appExcel As Object
Set appExcel = CreateObject("Excel.Application")
appExcel.Visible = False
appExcel.Application.Workbooks.Open (path)
Set objActiveWkb = appExcel.Application.ActiveWorkbook
With objActiveWkb
Dim i As Integer
For i = 1 To .Worksheets.count
.Worksheets(i).Select
.Worksheets(i).Cells.EntireColumn.AutoFit
.Worksheets(i).ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes).name = "myTable1"
Next
End With
appExcel.ActiveWindow.TabRatio = 0.7
objActiveWkb.Close savechanges:=True
appExcel.Application.Quit
Set objActiveWkb = Nothing: Set appExcel = Nothing
End Sub
코드 하단 근처에서 오류가 발생합니다. 라인입니다 :
.Worksheets (i) .ListObjects.Add (xlSrcRange, Range ( "A1"). CurrentRegion,, xlYes) .name = "myTable1"
내가 빠뜨린 몇 가지 기능이있을 수 있지만 제대로 작동하며 질문에 답하는 데 필요하지 않아야합니다.
이것은 유일한 관련 코드입니다.
Set objActiveWkb = appExcel.Application.ActiveWorkbook With objActiveWkb Dim i As Integer For i = 1 To .Worksheets.count .Worksheets(i).Select .Worksheets(i).Cells.EntireColumn.AutoFit .Worksheets(i).ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes).name = "myTable1" Next End With
상황이 당신이 멀리 보풀을 트림 시작할 때 따라 더 쉽게 일을 명명 - 할 필요가 없습니다 .Select
아무것도, appExcel
이다 이미Application
객체, 단지에서 사용하기에 현재 통합 문서에 복사 참조를 만들 필요가 없습니다 With
블록, 특히이 경우 복사본은 Object
어쨌든 변수 가 될 것입니다 . 복사본이 Workbook
개체 인 경우 최소한 해당 멤버에 대한 IntelliSense를 얻을 수 있습니다.
소스 범위가 모호합니다. Range("A1")
Excel-VBA 에서 활성 워크 시트에 대한 암시 적 참조입니다.하지만 이것은 Access-VBA이므로 그런 것이 없습니다 xlSrcRange
. Excel 개체 모델에 정의 된 열거 형 값이므로 Excel에 대한 참조가없는 경우 개체 모델 (이것을 늦게 바인딩하는 것입니다, 맞죠?), Option Explicit
지정되지 않은 경우 xlSrcRange
VBA에서 선언되지 않은 / 초기화되지 않은 다른 변수처럼 처리되므로 0
거기에 전달 하고 xlSrcRange
열거 형 값은 1
-그리고 0
우연히 xlSrcExternal
. 와 동일합니다 xlYes
.
게시 한 코드에서 실제 소스 범위가 무엇인지 추측 할 수 없기 때문에 다음과 같이 남겨 두겠습니다.
Dim target As Object
Dim srcRange As Object
Set srcRange = TODO
With appExcel.ActiveWorkbook
Dim i As Integer
For i = 1 To .Worksheets.Count
.Worksheets(i).Cells.EntireColumn.AutoFit
Set target = .Worksheets(i).ListObjects.Add(1, srcRange, , 1)
If target Is Not Nothing Then target.Name = "myTable1"
Next
End With
부수적 인 질문 ... myTable1
Excel이 이미 이름을 지정했을 때 테이블 이름을 지정하는 이유 는 Table1
무엇입니까? 또한 경우주의 .Add
실패하면 호출 될 것 때문에 코드는 런타임 오류 (91)와 불면 .Add
떨어져 Nothing
. 설정하기 전에 target
가 아닌지 확인하면 이 를 방지 할 수 있습니다.Nothing
Name
댓글에있는 질문에 답하려면 :
@ Mat'sMug는 이것이 당신이 말하는 것입니까? "438 : 개체가이 속성 또는 메서드를 지원하지 않습니다."라는 오류가 발생하기 때문입니다. 코드는 다음과 같습니다.
.Worksheets(i).ListObjects.Add(SourceType:=xlSrcRange, Source:=.Cells(1).CurrentRegion, _ XlListObjectHasHeaders:=xlYes, TableStylename:="TableStyleMedium1").name = "Table"
이것이 438을 던지는 이유는 With
블록 변수가 Workbook
객체이고 Workbook
객체에 .Range
멤버 가 없기 때문 입니다.
내가 대해 이야기했다입니다 엑셀 VBA되지 않은 호출에서 Range
, Row
, Column
, 및 Cells
암시를 참조하고 ActiveSheet
,과에 지정되지 않은 호출 Worksheets
, Sheets
그리고 Names
암시 적으로 참조하는 ActiveWorkbook
- VBA 코드의 많은 매우 일반적인 실수에의 재발 문제의 그 하다. 해결책은 기본적으로 당신이 의미하는 바를 말하는 것입니다 . 이 경우 실패는 "mean what you say" Range("A1")
에 있습니다. 오류 메시지에 따르면 [_Globals].Range("A1")
...를 호출 하는 정규화되지 않은 호출은 Excel 개체 모델 라이브러리를 참조하고 있음을 의미하므로 이상합니다. Object
바인딩 과 변수는 초기에 바인딩 될 수 있습니다.Object
늦게 바인딩하는 라이브러리를 이미 참조하고 있을 때 변수 및 IntelliSense 부족 ?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다