[英]Excel synchronize workbooks with vba
我想问一下您是否可以帮助我将工作簿A中的一些工作表数据复制到我的活动工作簿(工作簿B)中
我在主工作簿中具有以下代码,用于从工作簿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
我知道,它打开了工作表A,并且突出显示并复制了数据。
该脚本不会将其粘贴到工作表B(从中执行脚本)
有人知道我做错了吗?
亲切的问候,谢谢您的帮助!
您应该首先在原点之前设置Mainbook(目的地)(如果要使用ActiveWorkbook
)。
'Set MainBook First
Set MainBook = ThisWorkbook
'Open All workbook:
Set Wb1 = Workbooks.Open("Z:\Folder\WorkbookA.xlsm")
为了清楚起见,这只是我担任OC的职责。
您必须正确引用您的工作簿和工作表对象
如果您必须粘贴范围的全部内容(包括格式,注释等),则需要编写如下代码(注释中的解释):
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
如果您只需要粘贴值,那么这就是方法(快得多!):
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
我的建议是永远不要使用ActiveWorkbook
。
在大多数情况下,当人们使用ActiveWorkbook
他们实际上是在使用ThisWorkbook
。 区别在于:
ActiveWorkbook
是当前选中的代码,它恰好在您的代码运行的那一刻“在屏幕上方”。 可以是用户在代码运行时单击的任何工作簿。 因此,您永远无法百分百确定获得正确的工作簿。
ThisWorkbook
是您的代码当前运行的实际工作簿。 而且这永远不会改变。 因此,这是一个定义明确的参考,目前尚无关于哪个工作簿最重要的内容。
关于为什么您的方法无效的原因
Set Wb1 = Workbooks.Open("Z:\Folder\WorkbookA.xlsm") 'this line makes WorkbookA the active one
Set MainBook = Application.ActiveWorkbook 'this makes MainBook = WorkbookA
因此,一个简单的Set MainBook = Application.ThisWorkbook
应该在这里工作。
另一个建议
Worksheets
Sheets
和Worksheets
是不同的。 确保可以使用Worksheets
Sheets
时不要使用Worksheets
。
Sheets
包含工作表和图表 Worksheets
仅包含工作表 如果示例Sheets(1).Range("A1")
是图表,则会失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.