我有 2 个不同的 excel 文件,存储在 C:\Test:
每次打开Book2后,需要将Book1的Sheet1中的数据自动复制到Book2的Sheet2中。
更新: 我尝试了以下 vba 代码(从 Excel 论坛在线研究)
Private Sub Workbook_Open()
Application.EnableEvents = False
Dim swb As Workbook, Lr As Long, LC As Long, sws As Worksheet
Dim dCell As Range, srg As Range, dwb As Workbook, dws As Worksheet
Set swb = Workbooks.Open("C:\Test\AAA\Book1.xlsx")
Set sws = swb.Worksheets("Sheet1")
Lr = sws.Cells(Rows.Count, 1).End(xlUp).Row
LC = sws.Cells(1, Columns.Count).End(xlToLeft).Column
Set srg = sws.Range(Cells(1, 1), Cells(Lr, LC))
Set dwb = ThisWorkbook
Set dws = dwb.Worksheets("Sheet2")
Set dCell = dws.Range("A1")
srg.Copy dCell
swb.Close SaveChanges:=False
dwb.Save
Application.EnableEvents = True
End Sub
但是,问题是 - 如果我从 Book1 的 Sheet1 中的第 1 个记录之后删除一些记录,那么 - 这些删除的记录仍然出现在 Book2 的 Sheet2 中!
我不擅长 vba,这只是我整个项目的一部分 抱歉这些问题
更新 2:
当我在 Sheet1、Book1 中有以下内容时:
然后,在打开 Sheet2、Book2 后,我看到(这是正确的,是我所期望的):
但是,如果我要删除 Sheet1、Book1 中的记录(从第二个开始):
然后,在打开 Sheet2、Book2 后,我仍然会看到那些从 Book2 记录中删除的内容(虽然我希望它们消失):
答案 0 :(得分:1)
当目标工作表的数据多于源工作表时,您需要在复制数据之前清除它。你可以用 Range-method ClearContents
:
Set dws = dwb.Worksheets("Sheet2")
dws.Usedrange.ClearContents
Set dCell = dws.Range("A1")
srg.Copy dCell
由于您似乎在复制整个工作表的数据,因此另一种方法是删除 ThisWorkbook
中的工作表并复制工作表本身:
' Delete Sheet2 (if present)
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Sheets("Sheet2").Delete
Application.DisplayAlerts = True
On Error GoTo 0
' Copy Sheet from sourceWorkbook
sws.Copy after:=ThisWorkbook.Sheets(1)
ActiveSheet.Name = "Sheet2" ' Copied sheet gets the active sheet automatically.
答案 1 :(得分:1)
Private Sub Workbook_Open()
Application.EnableEvents = False
Dim swb As Workbook, sws As Worksheet, srg As Range, LR As Long, LC As Long
Dim dwb As Workbook, dws As Worksheet, dCell As Range
Set swb = Workbooks.Open("C:\Test\AAA\Book1.xlsx")
Set sws = swb.Worksheets("Sheet1")
LR = sws.Cells(sws.Rows.Count, 1).End(xlUp).Row
LC = sws.Cells(1, sws.Columns.Count).End(xlToLeft).Column
Set srg = sws.Range(sws.Cells(1, 1), sws.Cells(LR, LC))
Set dwb = ThisWorkbook
Set dws = dwb.Worksheets("Sheet2")
Set dCell = dws.Range("A1")
srg.Copy dCell
With dCell.Resize(, srg.Columns.Count)
.Resize(.Worksheet.Rows.Count - .Row - srg.Rows.Count + 1) _
.Offset(srg.Rows.Count).Clear
End With
swb.Close SaveChanges:=False
dwb.Save
Application.EnableEvents = True
End Sub