我有一个简单的过程来接收文件名,它所做的只是打开文件,复制一系列数据并将其粘贴到Access数据库中。
如果我一次运行一个文件,它会很好地工作,但是一旦我将第二个文件传递给它,它就会引发对象'_Global'的方法'Range'失败。如果我关闭并重新开始,那很好。
有人知道我在做什么错吗?
我已经阅读了有关此错误的其他问题,并尝试了100种不同的感觉,但仍然出现此错误。
我确认所有文件中都没有任何不同。我一次至少运行了15个文件,并且它们可以正常运行。我尝试使用Select而不是range等以不同的方式调用范围。
我在Access 2010和Access 2016中都尝试过。
该错误发生在下面>>>问题所在行之后。
Dim appExcel As Excel.Application
Dim myWorkbook As Excel.Workbook
Dim mysheet As Excel.Worksheet
Set appExcel = CreateObject("Excel.Application")
Set myWorkbook = appExcel.Workbooks.Open(vfilepath & "\" & vfilename)
appExcel.Visible = True
With appExcel
With appExcel.Worksheets("Sheet1").Activate
>>> PROBLEM HERE
>>> Worksheets("Sheet1").Range("B2", Range("N2").End(xlDown)).Select
Selection.Copy
End With
DoCmd.OpenTable "tblExcelImport_Main", acViewNormal
DoCmd.RunCommand acCmdPasteAppend
DoCmd.Close acTable, "tblExcelImport_Main", acSaveYes
myWorkbook.Close
appExcel.Quit
Set appExcel = Nothing
Set myWorkbook = Nothing
rst.Close
cnn.Close
End With
End If
我只需要它遍历每个文件直到完成(尝试25个文件-没有很大的文件)。
答案 0 :(得分:4)
这里有很多问题:
Select
和Activate
Worksheets
参考。访问权限不了解Worksheets
,这会出错Range
参考。访问权限不了解Range
,这会出错With
块,但实际上并没有使用它们如果此代码是用Excel VBA编写的,则不合格的Worksheets(...
表示ActiveWorkbook.Worksheets(...
,不合格的Range(...
表示ActiveSheet.Range(...
由于此代码是用Access VBA编写的,因此VBA无法解析那些隐式引用。
因此,所有Excel对象和方法都必须完全符合Excel Application对象appExcel
重构:
Set appExcel = CreateObject("Excel.Application")
Set myWorkbook = appExcel.Workbooks.Open(vfilepath & "\" & vfilename)
'...
Set mysheet = myWorkbook.Worksheets("Sheet1")
With mysheet
.Range("B2", .Range("N2").End(xlDown)).Copy
End With
'....
Set mysheet = Nothing
myWorkbook.Close
Set myWorkbook = Nothing
appExcel.Quit
Set appExcel = Nothing
答案 1 :(得分:0)
使用With
时,您需要加句号/句号.
这样的事情(我也清理了选择的内容)
With appExcel
.Sheets("Sheet1").Range("B2", .Sheets("Sheet1").Range("N2").End(xlDown)).Copy
End With
不太确定为什么会有第二个With
。