MS Access中的复制范围抛出1004错误

时间:2019-08-28 22:40:22

标签: excel access-vba

我有一个简单的过程来接收文件名,它所做的只是打开文件,复制一系列数据并将其粘贴到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个文件-没有很大的文件)。

2 个答案:

答案 0 :(得分:4)

这里有很多问题:

  1. 不必要的SelectActivate
  2. 不合格的Worksheets参考。访问权限不了解Worksheets,这会出错
  3. 不合格的Range参考。访问权限不了解Range,这会出错
  4. 虽然您已经编码了With块,但实际上并没有使用它们
  5. Excel.Application对象没有工作表集合
  6. 以错误的顺序清理对象

如果此代码是用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