Excel copy/paste 数据基于多个文件中的选项卡名称

Excel copy/paste data based on tab names in multiple files

我的处境(希望如此)轻松。我正在寻求使用 VBA 宏自动执行此过程。

我有一个 Excel 电子表格(我们称之为 data.xls),其中包含多个具有以下名称的选项卡(这只是一个示例):

Sucralose
Cellulose
Dextrose

每个选项卡中只有一列数据。 我想知道是否有一种简单的方法可以将所有数据选项卡复制到另一个具有特定格式的电子表格以进行进一步操作(我们称之为 reduction.xls)基于选项卡命名。

例如:

我想将选项卡蔗糖、葡萄糖、纤维素的 A 列从 data.xls 复制到 reduction.xls [蔗糖、葡萄糖、纤维素] 中相同命名选项卡(已经存在)的 F 列。

我正在寻找一个 "true/false" 类型的语句,其中 data.xls 中每个选项卡的列将被粘贴到 reduction.xls 中,假设存在完全相同的命名选项卡,没有任何需要供用户互动。

就我个人而言,我会在一个单独的工作簿中创建 VBA,您可以独立于其他 2 个交互工作簿打开和执行该工作簿。

于是我定义了三维。 wbk = 包含代码的工作簿。 wbk1 = 您将从中复制的源工作簿。 wbk2 - 您将粘贴到的目标工作簿。

您必须编辑文件位置和范围。假设您只想要 A1:A100,前提是每次的行数相同。如果不是,我建议将行数增加到远远超过您预期的行数,以确保您不会错过任何一个。

  1. 转到新工作簿
  2. 按住 Alt 键并按 F11 键
  3. 单击插入 -> 模块
  4. 将以下代码粘贴到 window 中,并根据需要更新文件位置和 copy/paste 范围
  5. 按 运行 宏(绿色播放按钮)或在代码中用光标按 F5

     Sub DataTransfer()
    
     Dim wbk, wbk1, wbk2 As Workbook
    
        'Workbook with VBA in it.
        Set wbk = ActiveWorkbook
    
        'Define destination workbook
        Set wbk1 = Workbooks.Open("C:\data.xls")
        'Define Source workbook
        Set wbk2 = Workbooks.Open("C:\reduction.xls")
    
    
    
    
        Call wbk1.Worksheets("Sucralose").Range("A1:A100000").Copy
        Call wbk2.Worksheets("Sucralose").Range("F1:F100000").PasteSpecial(xlPasteValues)
        Application.CutCopyMode = False
    
    
        Call wbk1.Worksheets("Cellulose").Range("A1:A100000").Copy
        Call wbk2.Worksheets("Cellulose").Range("F1:F100000").PasteSpecial(xlPasteValues)
        Application.CutCopyMode = False
    
    
        Call wbk1.Worksheets("Dextrose").Range("A1:A100000").Copy
        Call wbk2.Worksheets("Dextrose").Range("F1:F100000").PasteSpecial(xlPasteValues)
        Application.CutCopyMode = False
    
        End Sub
    

下面发布的代码具有以下特点:

  1. 它是为轻松处理任意数量的标签而准备的。您只需修改 3 行,如图所示:1) 选项卡名称列表,2) 源工作簿的名称,3) 目标工作簿的名称。
  2. 针对目标工作簿中缺少的选项卡"protected"。
  3. 该结构可能是不言自明的(尽管这可能是主观陈述)。

.

Sub copy_tab(ByVal wsName As String)
    Dim wbnamesrc As String
    Dim wbnametrg As String
    wbnamesrc = "source.xlsm"      ' Change this line
    wbnametrg = "Book8"      ' Change this line
    Dim wbsrc As Workbook
    Dim wbtrg As Workbook
    Set wbsrc = Workbooks(wbnamesrc)
    Set wbtrg = Workbooks(wbnametrg)

    If (WorksheetExists(wsName, wbnametrg)) Then
        Dim rngsrc As Range
        Dim rngtrg As Range
        Application.CutCopyMode = False
        wbsrc.Worksheets(wsName).Range("A:A").Copy
        wbtrg.Worksheets(wsName).Range("A:A").PasteSpecial
    End If
End Sub

Sub copy_tabs()
    Dim wslist As String
    Dim sep As String
    wslist = "Sucralose|Cellulose|Dextrose|Sheet1"      ' Change this line
    sep = "|"
    Dim wsnames() As String
    wsnames = Split(wslist, sep, -1, vbBinaryCompare)

    Dim wsName As String
    Dim wsnamev As Variant
    For Each wsnamev In wsnames
        wsName = CStr(wsnamev)
        Call copy_tab(wsName)
    Next wsnamev
End Sub

Public Function str_split(str, sep, n) As String
' From http://superuser.com/questions/483419/how-to-split-a-string-based-on-in-ms-excel
' splits on your choice of character and returns the nth element of the split list.
    Dim V() As String
    V = Split(str, sep)
    str_split = V(n - 1)
End Function

' From 
Public Function WorksheetExists(ByVal wsName As String, ByVal wbName As String) As Boolean
    Dim ws As Worksheet
    Dim ret As Boolean
    ret = False
    wsName = UCase(wsName)
    For Each ws In Workbooks(wbName).Worksheets
        If UCase(ws.Name) = wsName Then
            ret = True
            Exit For
        End If
    Next
    WorksheetExists = ret
End Function