簡體   English   中英

VBA運行時錯誤1004:嘗試在Excel 2013中創建表時,對象_Global的方法范圍失敗

[英]VBA Run-time error 1004: Method Range of object _Global failed when trying to create tables in Excel 2013

我知道以前曾發布過類似錯誤的問題,但是在格式化表格時我什么也沒發現,所以請不要關閉它。 在MS Access 2013中的VBA代碼中,它將數據從MS Access導出到Excel。 6個不同的查詢被導出到1個excel文件中,每個文件都在不同的工作表上。 這很好。 然后,我格式化每個工作表以將所有數據存儲在一個表中。 我有一個表格,可以讓用戶選擇保存文件的路徑。 如果是第一次創建文件,則它可以正常工作。 如果是第二次在同一目錄中創建文件,則無法正常工作,並且出現錯誤:

運行時錯誤1004:對象_Global的方法范圍失敗

我認為這是因為我要覆蓋文件而不是刪除並重新創建它。 因此,我添加了一些代碼來檢查文件是否存在,如果存在,請刪除它。 我添加了斷點,並且在運行這部分代碼時,我正在查看我的documents文件夾。 該文件已成功刪除,然后重新創建了我想要的文件。 它仍然給我那個錯誤。 我手動去刪除了文件,然后再次重新運行我的代碼。 它工作正常。

我為什么需要手動刪除此文件才能重新運行代碼? 還是引起問題的其他原因? 這是我代碼的重要部分,因為整個內容發布太久了:

'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是活動工作表的隱式引用..但這是接入VBA,所以有沒有這樣的事情, xlSrcRange是在Excel對象模型中定義的枚舉值,所以如果你不”沒有對Excel對象模型的引用(您要對此進行后期綁定,對嗎?),並且未指定Option Explicit ,則VBA將xlSrcRange視為另一個未聲明/未初始化的變量,因此您正在傳遞在那里為0xlSrcRange枚舉值代表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時,為何將其命名為myTable1 Table1 還要注意,如果.Add失敗,則您的代碼會因運行時錯誤91而.Add ,因為您將調用.Add off Nothing 在設置target Name之前驗證target是否為Nothing將避免這種情況。

要在評論中回答您的問題:

@ Mat'sMug這是您在說的嗎? 因為它給了我這個錯誤:“ 438:對象不支持此屬性或方法”這是代碼: .Worksheets(i).ListObjects.Add(SourceType:=xlSrcRange, Source:=.Cells(1).CurrentRegion, _ XlListObjectHasHeaders:=xlYes, TableStylename:="TableStyleMedium1").name = "Table"

拋出438的原因是因為With塊變量是Workbook對象,而Workbook對象沒有.Range成員。

我所說的是,在Excel VBA中,對RangeRowColumnCells不合格調用隱式地引用ActiveSheet ,而對WorksheetsSheetsNames不合格調用隱式地引用了ActiveWorkbook ,這是一個經常出現的問題VBA代碼和一個非常常見的錯誤。 解決方法基本上是說出您的意思,然后說出您的意思 在這種情況下,失敗的是“意思是你說的話” -不合格的Range("A1")調用,根據錯誤信息,調用[_Globals].Range("A1") ......這是奇怪的,因為它意味着您正在引用Excel對象模型庫,這意味着后期綁定和Object變量也可能早綁定:為什么當您已經引用庫時為什么要處理Object變量而缺少IntelliSense后期綁定到?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM