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,前提是每次的行数相同。如果不是,我建议将行数增加到远远超过您预期的行数,以确保您不会错过任何一个。
- 转到新工作簿
- 按住 Alt 键并按 F11 键
- 单击插入 -> 模块
- 将以下代码粘贴到 window 中,并根据需要更新文件位置和 copy/paste 范围
按 运行 宏(绿色播放按钮)或在代码中用光标按 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
下面发布的代码具有以下特点:
- 它是为轻松处理任意数量的标签而准备的。您只需修改 3 行,如图所示:1) 选项卡名称列表,2) 源工作簿的名称,3) 目标工作簿的名称。
- 针对目标工作簿中缺少的选项卡"protected"。
- 该结构可能是不言自明的(尽管这可能是主观陈述)。
.
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
我的处境(希望如此)轻松。我正在寻求使用 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,前提是每次的行数相同。如果不是,我建议将行数增加到远远超过您预期的行数,以确保您不会错过任何一个。
- 转到新工作簿
- 按住 Alt 键并按 F11 键
- 单击插入 -> 模块
- 将以下代码粘贴到 window 中,并根据需要更新文件位置和 copy/paste 范围
按 运行 宏(绿色播放按钮)或在代码中用光标按 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
下面发布的代码具有以下特点:
- 它是为轻松处理任意数量的标签而准备的。您只需修改 3 行,如图所示:1) 选项卡名称列表,2) 源工作簿的名称,3) 目标工作簿的名称。
- 针对目标工作簿中缺少的选项卡"protected"。
- 该结构可能是不言自明的(尽管这可能是主观陈述)。
.
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