打开第二个工作簿时应用程序定义或对象定义的错误

时间:2017-07-26 09:39:09

标签: excel vba excel-vba

我有这个代码,我打开第一个工作簿,然后打开第二个工作簿,从第一个工作簿复制范围并将其粘贴到第二个工作簿中。

 Sub test()
        '**VARIABLES**
        Dim folderPath As String
        folderPath = "Y:\plan_graphs\final\mich_alco_test\files\"
        Dim fileTitle As String
        fileTitle = "5.xlsx"

        Dim dataWorkbook As Workbook
        Set dataWorkbook = Application.Workbooks.Open(folderPath & fileTitle)

        'Dim resultWorkbook As Workbook
        'Set resultWorkbook = Application.Workbooks.Open("Y:\plan_graphs\final\mich_alco_test\result.xlsx")

        Dim copyRange As Range
        Set copyRange = dataWorkbook.Worksheets("List1").Range("A3:F3", Range("A3").End(xlDown))

        copyRange.Copy
        'resultWorkbook.Worksheets("1").Range("A3").PasteSpecial Paste:=xlPasteFormulas


End Sub

但我在行上发现Application defined or object-defined error错误

Set copyRange = dataWorkbook.Worksheets("List").Range("A3:F3", Range("A3").End(xlDown))     

当我评论与第二个工作簿相关的行时,不会发生错误。为什么会发生这种错误?

编辑:有趣的是,如果我在打开第二个工作簿之前定义并设置copyRange ,它就可以正常工作......我&# 39;我真的很好奇打开第二个文件会使copyRange变得混乱,以及为什么以后打开该文件会有所帮助。

2 个答案:

答案 0 :(得分:2)

这取决于您在运行代码时处于活动状态的工作簿 这行代码可能会查看两个不同的工作簿:
Set copyRange = dataWorkbook.Worksheets("List").Range("A3:F3", Range("A3").End(xlDown))

dataWorkbook.Worksheets("List").Range("A3:F3" - 这始终会查看List中的dataWorkbook表格。

Range("A3").End(xlDown) - 当这些行没有被注释掉时,它始终会查看resultWorkBook中的当前活动表。

使用:
Set copyRange = dataWorkbook.Worksheets("List").Range("A3:F3", dataWorkbook.Worksheets("List").Range("A3").End(xlDown))

With dataWorkbook.Worksheets("List")
    Set copyRange = .Range("A3:F3", .Range("A3").End(xlDown))
End With

答案 1 :(得分:1)

试试这样:

Option Explicit

 Sub TestMe()

    Dim folderPath      As String
    Dim dataWorkbook    As Workbook
    Dim resultWorkbook  As Workbook
    Dim copyRange       As Range

    folderPath = "C:\Users\USER_CHANGE\Desktop\"
    Set dataWorkbook = Application.Workbooks.Open(folderPath & "5.xlsx")
    Set resultWorkbook = Application.Workbooks.Open(folderPath & "6.xlsx")

    dataWorkbook.Activate
    Set copyRange = dataWorkbook.Worksheets(1).Range("A3:F3", Range("A3").End(xlDown))

    copyRange.Copy
    resultWorkbook.Worksheets(1).Range("A3").PasteSpecial Paste:=xlPasteFormulas

    dataWorkbook.Close True
    resultWorkbook.Close True

End Sub

我更改了一下folderPath,并添加了dataWorkbook.Activate,用于复制和粘贴。还有其他方法,以避免激活,但它的工作原理。最后,我关闭了两个工作簿,然后保存更改。

此外,Worksheets由索引引用。