两个工作簿,相同的工作表名称:如果工作表匹配则复制和粘贴
Two workbooks, Same Sheets Names: Copy and Paste if Sheets are matched
我有两个工作簿,sheet 的名称相同(但顺序不同),我想复制一个工作簿的所有 sheet 的信息,然后粘贴该信息在其他工作簿的相应 sheet 中(匹配 sheet 名称)。我觉得这段代码是正确的,但也许有更有效或更简洁的方法来做到这一点。代码正在运行,但它显示警告,如“windows 剪贴板中有大量数据......等等......“
Sub ActualizarNoticias()
Dim aw As Workbook
Dim y As Workbook
Set aw = Application.ActiveWorkbook
Set y = Application.Workbooks.Open("G:\Estudios\Biblioteca\Mercado Accionario Chileno\BBDD Oficial.xlsm")
For i = 1 To aw.Sheets.Count
For j = 1 To y.Sheets.Count
If aw.Worksheets(i).Name = y.Worksheets(j).Name Then
y.Worksheets(j).Range("A3").Copy
aw.Worksheets(i).Range("A100").PasteSpecial
End If
Next j
Next i
y.close
' ActualizarNoticias Macro
'
'
End Sub
我不确定你打算复制多少数据,或者你想复制到目标工作簿中的哪个位置,但是你发布的代码只复制了一个单元格(A3)并将其复制到单元格中的目标工作簿中A100。我收集你的代码只是一个例子,因为复制单个单元格肯定不会出现警告。获得您的实际范围和准确的警告消息会有所帮助,但正如您所说,它正在起作用。当您 运行 代码或退出工作簿时,您是否收到消息?如果是后者(正如我怀疑的那样),那么您只需清除代码末尾的剪贴板即可:
Application.CutCopyMode = False
你也可以用小技巧消除第二个循环:
Set sh = Nothing
On Error Resume Next
Set sh = y.Worksheets(aw.Worksheets(i).Name)
On Error GoTo 0
If TypeName(sh) <> "Nothing" Then
....
End If
我的整个子程序如下所示:
Sub CopyWorkbook()
Dim aw As Workbook
Dim y As Workbook
Dim sh As Worksheet
Set aw = Application.ActiveWorkbook
Set y = Application.Workbooks.Open("C:\work\fusion\expenseTypes.xls.xlsx")
For i = 1 To aw.Sheets.Count
Set sh = Nothing
On Error Resume Next
Set sh = y.Worksheets(aw.Worksheets(i).Name)
On Error GoTo 0
If TypeName(sh) <> "Nothing" Then
sh.Range("A:C").Copy aw.Worksheets(i).Range("A1")
End If
Next i
Application.CutCopyMode = False
End Sub
我认为这是最有效的方法。我上面的示例代码复制了整个列(A 到 C),它保留了列格式,因此无需重新调整新工作簿的列宽。
我有两个工作簿,sheet 的名称相同(但顺序不同),我想复制一个工作簿的所有 sheet 的信息,然后粘贴该信息在其他工作簿的相应 sheet 中(匹配 sheet 名称)。我觉得这段代码是正确的,但也许有更有效或更简洁的方法来做到这一点。代码正在运行,但它显示警告,如“windows 剪贴板中有大量数据......等等......“
Sub ActualizarNoticias()
Dim aw As Workbook
Dim y As Workbook
Set aw = Application.ActiveWorkbook
Set y = Application.Workbooks.Open("G:\Estudios\Biblioteca\Mercado Accionario Chileno\BBDD Oficial.xlsm")
For i = 1 To aw.Sheets.Count
For j = 1 To y.Sheets.Count
If aw.Worksheets(i).Name = y.Worksheets(j).Name Then
y.Worksheets(j).Range("A3").Copy
aw.Worksheets(i).Range("A100").PasteSpecial
End If
Next j
Next i
y.close
' ActualizarNoticias Macro
'
'
End Sub
我不确定你打算复制多少数据,或者你想复制到目标工作簿中的哪个位置,但是你发布的代码只复制了一个单元格(A3)并将其复制到单元格中的目标工作簿中A100。我收集你的代码只是一个例子,因为复制单个单元格肯定不会出现警告。获得您的实际范围和准确的警告消息会有所帮助,但正如您所说,它正在起作用。当您 运行 代码或退出工作簿时,您是否收到消息?如果是后者(正如我怀疑的那样),那么您只需清除代码末尾的剪贴板即可:
Application.CutCopyMode = False
你也可以用小技巧消除第二个循环:
Set sh = Nothing
On Error Resume Next
Set sh = y.Worksheets(aw.Worksheets(i).Name)
On Error GoTo 0
If TypeName(sh) <> "Nothing" Then
....
End If
我的整个子程序如下所示:
Sub CopyWorkbook()
Dim aw As Workbook
Dim y As Workbook
Dim sh As Worksheet
Set aw = Application.ActiveWorkbook
Set y = Application.Workbooks.Open("C:\work\fusion\expenseTypes.xls.xlsx")
For i = 1 To aw.Sheets.Count
Set sh = Nothing
On Error Resume Next
Set sh = y.Worksheets(aw.Worksheets(i).Name)
On Error GoTo 0
If TypeName(sh) <> "Nothing" Then
sh.Range("A:C").Copy aw.Worksheets(i).Range("A1")
End If
Next i
Application.CutCopyMode = False
End Sub
我认为这是最有效的方法。我上面的示例代码复制了整个列(A 到 C),它保留了列格式,因此无需重新调整新工作簿的列宽。