简体   繁体   中英

Excel synchronize workbooks with vba

I'd like to ask if you could help me with copying some worksheet data from workbook A into my active workbook (workbook B)

I have the following code in the main workbook to copy the data from workbook A

Public Sub Worksheet_Activate()

    test

End Sub


Sub test()
    Dim Wb1 As Workbook
    Dim MainBook As Workbook

    'Open All workbooks first:
    Set Wb1 = Workbooks.Open("Z:\Folder\WorkbookA.xlsm")
'Set MainBook = Workbooks.Open(Application.ActiveWorkbook.FullName)
Set MainBook = Application.ActiveWorkbook

'Now, copy what you want from wb1:
Wb1.Sheets("Projekte").Cells.Copy
'Now, paste to Main worksheet:
MainBook.Worksheets("Projekte").Range("A1").PasteSpecial xlPasteAll
Application.CutCopyMode = False

    'Close Wb's:
    Wb1.Close SaveChanges:=False

End Sub

I know, that it opens worksheet A and that it highlights and copys the data.

The script wont paste it into worksheet B (where the script is executed from)

Anybody know what i did wrong?

Kindest regards, and thanks for any help !

You should set the Mainbook (destination) first before the origin (if you're going to use ActiveWorkbook ).

'Set MainBook First
   Set MainBook = ThisWorkbook
'Open All workbook:
   Set Wb1 = Workbooks.Open("Z:\Folder\WorkbookA.xlsm")

Just for clarity, it's just me being OC on this one.

you have to properly reference your workbook and worksheet objects

if you have to paste the whole content of range (including formatting, comments, ...), then you want to code like follows (explanations in comments):

Option Explicit

Sub test()
    Dim targetSheet As Worksheet

    Set targetSheet = ActiveSheet 'store currently active sheet
    Workbooks.Open("Z:\Folder\WorkbookA.xlsm").Sheets("Projekte").UsedRange.Copy Destination:=targetSheet.Range("A1") ' open the wanted workbook and copy its "Projekte" sheet used range to 'targetSheet (i.e.: the sheet in the workbook where it all started) from its cell A1
    ActiveWorkbook.Close SaveChanges:=False ' close the currently active workbook (i.e. the just opened one)
End Sub

if you only need to paste values, then this is the way to go (much faster!):

Option Explicit

Sub test()
    Dim targetSheet As Worksheet

    Set targetSheet = ActiveSheet 'store currently active sheet

    With Workbooks.Open("Z:\Folder\WorkbookA.xlsm").Sheets("Projekte").UsedRange ' open the wanted workbook and reference its sheet "Projekte" used range
        targetSheet.Range("A1").Resize(.Rows.Count, .Columns.Count).Value = .Value
        .Parent.Parent.Close SaveChanges:=False 'close the parent workbook of referenced range (i.e., the newly opened workbook)
    End With
End Sub

My recommendation is never to use ActiveWorkbook .

In most cases when people use ActiveWorkbook they actually meant to use ThisWorkbook . The difference is:

  • ActiveWorkbook is the currently selected one which is "on top of the screen" in exact that moment when your code runs. That can be any workbook the user just clicked on while your code runs. So you never can be 100% sure to get the right workbook.

  • ThisWorkbook is the actual workbook your code runs at the moment. And this doesn't change ever. So this is a well defined reference and no gamble about which workbook is on top at the moment.

About why your approach did not work

Set Wb1 = Workbooks.Open("Z:\Folder\WorkbookA.xlsm") 'this line makes WorkbookA the active one
Set MainBook = Application.ActiveWorkbook 'this makes MainBook = WorkbookA

Therefore a simple Set MainBook = Application.ThisWorkbook should work here.

Another recommendation

Sheets and Worksheets is not the same. Make sure you never use Sheets when you can use Worksheets .

  • Sheets contains worksheets and charts
  • Worksheets contain only worksheets

An example Sheets(1).Range("A1") fails if it is a chart.

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