如何编写无需指定表名、遍历工作簿所有工作表的Excel宏?
自动合并所有工作表数据的Excel宏实现
直接用VBA遍历工作簿内所有工作表即可解决,不用手动指定表名,新增工作表后也能自动识别。下面是完整代码和关键说明:
完整宏代码
Sub 合并所有工作表数据() Dim ws As Worksheet Dim 汇总表 As Worksheet Dim 源数据最后行 As Long Dim 汇总表最后行 As Long ' 创建或定位汇总表(这里命名为"汇总数据",可自行修改) On Error Resume Next Set 汇总表 = ThisWorkbook.Worksheets("汇总数据") On Error GoTo 0 If 汇总表 Is Nothing Then Set 汇总表 = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)) 汇总表.Name = "汇总数据" ' 复制第一个工作表的表头到汇总表(如果需要保留表头) ThisWorkbook.Worksheets(1).Rows(1).Copy 汇总表.Rows(1) End If ' 遍历所有工作表 For Each ws In ThisWorkbook.Worksheets ' 跳过汇总表本身,避免重复合并 If ws.Name <> 汇总表.Name Then ' 获取当前工作表的有效数据最后一行 源数据最后行 = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 如果当前表有数据(表头不算的话,这里判断最后行>1) If 源数据最后行 > 1 Then ' 获取汇总表的最后空行 汇总表最后行 = 汇总表.Cells(汇总表.Rows.Count, "A").End(xlUp).Row + 1 ' 复制当前表的数据(从第2行开始,跳过表头) ws.Range("A2:" & ws.Cells(源数据最后行, ws.Columns.Count).End(xlToLeft).Address).Copy _ 汇总表.Cells(汇总表最后行, "A") End If End If Next ws MsgBox "数据合并完成!", vbInformation End Sub
关键说明
- 自动识别所有工作表:通过
For Each ws In ThisWorkbook.Worksheets循环遍历工作簿内每一个工作表,新增的工作表会被自动包含 - 汇总表自动创建:如果没有名为"汇总数据"的工作表,宏会自动新建;如果已有,则直接在已有表上追加数据
- 跳过表头重复:默认只复制第一个工作表的表头,后续工作表从第2行开始复制数据,避免表头重复(如果不需要表头,可删除复制表头的代码段)
- 仅复制有效数据:通过
End(xlUp)和End(xlToLeft)定位到实际有数据的区域,不会复制空行空列
使用注意
- 运行宏前建议先保存工作簿
- 如果部分工作表结构不一致(比如列数不同),合并后可能出现数据错位,需确保所有待合并工作表的列结构一致
- 可根据需求修改汇总表的名称(代码里的"汇总数据")
内容的提问来源于stack exchange,提问作者Marissa
相关产品推荐
相关产品推荐

