两个工作簿,相同的表格名称:如果匹配表格,则复制和粘贴

时间:2016-04-29 01:45:59

标签: excel-vba if-statement match worksheet vba

我有两个工作簿,具有相同的工作表名称(但顺序不同),我想复制一个工作簿的所有工作表的信息,并将该信息粘贴到另一个工作簿的相应工作表中(匹配工作表名称)。我觉得这段代码正在进行中,但也许有更高效或更清晰的方法来实现这一目标。代码正在运行,但它会发出警告,例如" Windows剪贴板中有大量数据......等等......"

let edges = [
  ("a", "b"); ("a", "c");
  ("a", "d"); ("b", "e");
  ("c", "f"); ("d", "e");
  ("e", "f"); ("e", "g")
];;

1 个答案:

答案 0 :(得分:1)

我不确定您要复制多少数据,或者要复制到目标工作簿中的位置,但您发布的代码只复制一个单元格(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),这保留了列格式,因此无需为列宽重新调整新工作簿。