标签:VBA
从多个Excel工作表(子工作表)中获取信息,并用子工作表中的所有数据填充汇总工作表(父工作表),这是很多朋友会提到的常见要求。如果部分数据是从添加新工作表到工作簿中而增长的,那么获得这些数据的汇总非常方便,例如,添加单独的工作表,包含新月份的数据。
将新工作表信息添加到汇总工作表的一种非常快速的方法是遍历工作簿中的所有工作表,使用VBA合并数据。如下图1所示(示例来源于thesmallman.com),有4个工作表(England、Scotland、Wales、Northernlreland)和一个汇总工作表(Summary),要将England、Scotland、Wales、Northernlreland工作表合并到Summary工作表中。
图1
工作表中的结构如下图2所示。
图2
数据必须从所有子表输入到上图2中的绿色区域。
这里的技巧是过程运行时排除汇总表,以便仅将子表或原始数据复制到汇总表中。下面VBA程序将执行此操作:
代码语言:javascript复制Sub Combine1()
Dim ws As Worksheet
Dim sh As Worksheet
Application.ScreenUpdating = False
Set sh = Sheet5 ' Summary工作表
sh.Range("A11:D1000").Clear
For Each ws In Sheets
If ws.Name <> "Summary" Then
ws.Range("A2", ws.Range("D" & Rows.Count).End(xlUp)).Copy _
sh.Range("A" & Rows.Count).End(xlUp)(2)
End If
Next ws
Application.ScreenUpdating = True
End Sub
以上是基于希望使用当前文件中的所有数据更新Summary工作表的前提,还假设Summary工作表中有标题。上面的过程首先将清除Summary工作表,但标题保持不变,以便将新数据粘贴到该工作表中。
此外,还可以将多个工作表中的数据复制到Summary工作表中某个单元格区域的底部。如果Summary工作表中有以前的信息,或者希望保留汇总工作表中原来的信息,则可以使用下面的程序:
代码语言:javascript复制Sub Combine2()
Dim ws As Worksheet
Dim sh As Worksheet
Set sh = Sheet5
For Each ws In Sheets
If ws.Name <> "Summary" Then
ws.Range("A2", ws.Range("D" & Rows.Count).End(xlUp)).Copy _
sh.Range("A" & Rows.Count).End(xlUp)(2)
End If
Next ws
End Sub
如果要在汇总数据时排除多个工作表,可以将And语句与If语句结合使用:
代码语言:javascript复制Sub Combine3()
Dim ws As Worksheet
Dim sh As Worksheet
Set sh = Sheet5
For Each ws In Sheets
If ws.Name <> "Summary" And ws.Name <> "shName" And ws.Name <> "shName2" Then
ws.Range("A2", ws.Range("D" & Rows.Count).End(xlUp)).Copy _
sh.Range("A" & Rows.Count).End(xlUp)(2)
End If
Next ws
End Sub
这样,除了Summary工作表外,shName和shName2工作表中的数据也不会被汇总。
注:你可以到thesmallman.com下载示例工作簿,或者到知识星球App完美Excel社群下载示例工作簿。