VBA 런타임 오류 1004 : Excel 2013에서 테이블을 만들려고 할 때 개체 _Global의 메서드 범위가 실패했습니다.

남자 이름

이 오류와 유사한 질문이 이전에 게시되었음을 이해하지만 표 서식 지정과 관련하여 아무것도 발견하지 않았으므로 닫지 마십시오. 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"

내가 빠뜨린 몇 가지 기능이있을 수 있지만 제대로 작동하며 질문에 답하는 데 필요하지 않아야합니다.

Mathieu Guindon

이것은 유일한 관련 코드입니다.

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지정되지 않은 경우 xlSrcRangeVBA에서 선언되지 않은 / 초기화되지 않은 다른 변수처럼 처리되므로 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

부수적 인 질문 ... myTable1Excel이 이미 이름을 지정했을 때 테이블 이름을 지정하는 이유 Table1무엇입니까? 또한 경우주의 .Add실패하면 호출 될 것 때문에 코드는 런타임 오류 (91)와 불면 .Add떨어져 Nothing. 설정하기 전에 target가 아닌지 확인하면 를 방지 할 수 있습니다.NothingName

댓글에있는 질문에 답하려면 :

@ 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관