错误1004 - 打开并激活工作簿

时间:2018-04-17 18:59:57

标签: excel vba excel-vba

尝试在工作簿之间复制/粘贴数据时遇到一些问题。我需要从两个不同的工作簿(A& B)中提取数据,将其放在第三个工作簿中。 自A& B具有完全相同的结构,我对它们使用相同的代码。但它适用于A,而我得到了B的错误1004。

当您没有正确指定父工作簿/工作表时,似乎会发生这种情况,但由于代码适用于A,我认为这不是问题。

如果有人对此事有所了解,我全都听见了!

感谢您的帮助!

CH

    Sub Data_Extraction()

    Dim wb As Workbook, wba As Workbook, wbb As Workbook
    Set wb = ActiveWorkbook
    Set wba= Workbooks.Open("D:\xxx\A.xlsx")
    Set wbb= Workbooks.Open("D:\xxx\B.xlsx")

    Dim wsa As Worksheet, wsb As Worksheet
    Set wsa = wb.Worksheets("a")
    Set wsb = wb.Worksheets("b")

   'I use a named variable here 
    X = Range("X")

    If X=2 Then

        ''We fill the tab a''
        For i = 9 To 400
           wba.Activate
           If wba.Worksheets("a").Cells(i, 2).Value = 5 Then
               wba.Worksheets("a").Range(Cells(i, 1), Cells(i, 8)).Copy
               wb.Activate
               wsa.Range(Cells(7, 2), Cells(7, 9)).PasteSpecial Paste:=xlPasteValues
               wsa.Range("B7").EntireRow.Insert
           End If
        Next i

        ''We fill the tab b''
        For i = 9 To 400
           wbb.Activate
           If wbb.Worksheets("b").Cells(i, 2).Value = 5 Then
               wbb.Worksheets("b").Range(Cells(i, 1), Cells(i, 8)).Copy
               wb.Activate
               wsb.Range(Cells(7, 2), Cells(7, 9)).PasteSpecial Paste:=xlPasteValues
               wsb.Range("B7").EntireRow.Insert
           End If
        Next i

    End If
   End Sub

2 个答案:

答案 0 :(得分:0)

在许多情况下,当您使用Excel方法(例如保护/取消保护复制/粘贴)时,您应该尽可能地模仿Excel在用户执行这些步骤时所处的配置,如果您离开那个步骤你可能会因为不稳定性而在通用错误代码中出现5和1004。

在这种情况下,我相信你应该做

wbb.Worksheets("b").Activate
在之前

从工作表开始复制(" b")。

答案 1 :(得分:0)

这里的真正问题不是您没有激活工作表(尽管可以工作,但这不是一个好的解决方案)

wbb.Worksheets("b").Range(Cells(i, 1), Cells(i, 8)).Copy

此处Cells()调用(不同于Range()调用)不受任何工作表对象的限制,因此它们将默认为ActiveSheet。在常规模块中,这等效于编写:

wbb.Worksheets("b").Range(ActiveSheet.Cells(i, 1), ActiveSheet.Cells(i, 8)).Copy

...并且如果活动工作表不是您期望的那样,则容易发生故障。

这很强大,不需要您激活特定的工作表:

With wbb.Worksheets("b")
     .Range(.Cells(i, 1), .Cells(i, 8)).Copy
End With