【发布时间】:2018-01-11 01:38:37
【问题描述】:
我知道之前已经发布过与这些错误类似的问题,但是在格式化表格时我什么也没找到,所以请不要关闭它。在我的 MS Access 2013 中的 VBA 代码中,它将数据从 MS Access 导出到 Excel。 6 个不同的查询被导出到 1 个 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"
我可能遗漏了几个功能,但它们工作正常,不需要回答问题。
【问题讨论】:
-
xlSrcRange与Range("A1")所指的活动工作表不在同一个工作表上。这应该是第 20000 次问这个问题了。解决方案是正确限定Range和Cells调用/避免对活动工作表或工作簿的隐式引用。 -
@Mat'sMug 你说的是这个吗?因为它给了我这个错误:“438:对象不支持这个属性或方法”这是代码:.Worksheets(i).ListObjects.Add(SourceType:=xlSrcRange, Source:=.Cells(1).CurrentRegion, _ XlListObjectHasHeaders:=xlYes, TableStylename:="TableStyleMedium1").name = "Table"