简体   繁体   中英

Error 1004 - Opening and activating workbooks

I have some issues while trying to copy/paste data between workbooks. I need to extract data from two different workbooks (A & B) to put it in a third one. Since A & B have the exact same structure, I use the same code for both of them. However it works for A and I've got an error 1004 for B.

It seems that it happens when you do not specify the parent workbook/worksheet properly but I don't think this is the issue here since the code works for A.

If someone has an insight on this matter, I'm all ears!

Thank you for your help!

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

In lots of cases when you use Excel methods like protect/unprotect copy/paste, you should try to mimick as close as possible the configuration Excel would be in when a user would go through those steps, if you step away from that you are likely to wind up with instability cropping up in generic error codes as 5 and 1004.

In this case I believe you should do

wbb.Worksheets("b").Activate

before you start a copy from worksheet("b").

The real problem here is not that you didn't activate the sheet (though that does work, it's not a good solution)

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

Here the Cells() calls (unlike the Range() call) are not qualified by any worksheet object, so they will default to the ActiveSheet. In a regular module this is equivalent to writing:

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

...and is prone to failure when the active sheet is not what you expect.

This is robust and doesn't require you to activate a specific worksheet:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM