首页 > 解决方案 > 在 MS Access VBA 中选择 Excel 范围抛出 1004 错误

问题描述

我有一个接收文件名并打开文件以将一系列数据复制到 Access 数据库中的过程。

如果我一次运行一个文件,它会起作用。

当我将第二个文件传递给它时,它会抛出

对象“_Global”的方法“范围”失败。

如果我关闭并重新开始就可以了。

我已经阅读了有关此错误的其他问题并尝试了不同的方法。

我确认任何文件都没有任何不同。我一次运行至少 15 个文件,并且一个接一个地运行良好。我尝试以不同的方式调用范围,使用 Select 而不是范围等。

我在 Access 2010 和 Access 2016 中都试过了。

错误发生在下面的 >>> PROBLEM HERE 行之后。

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 个文件 - 没有一个很大)。

标签: excelvbams-access

解决方案


这里有很多问题:

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

如果此代码是用 Excel VBA 编写的,则 unqualifiedWorksheets(...将暗示ActiveWorkbook.Worksheets(...,而 unqualifiedRange(...将暗示ActiveSheet.Range(...

由于此代码是用 Access VBA 编写的,因此 VBA 无法解析那些隐式引用。

因此,所有 Excel 对象和方法都必须完全限定回 Excel 应用程序对象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


推荐阅读