【Excel VBA 实战】一键批量合并多个工作表,自动汇总不重复
还在手动复制粘贴,把十几个Sheet合并成一张总表?销售日报、门店报表、分部门数据、月度台账……手动合并1小时,VBA只需要1秒!今天教你用一段代码,一键汇总所有工作表,自动去重、保留格式、不乱行不乱列。
🎯 你将获得的效果
-
一键把当前文件所有Sheet合并到一张总表 -
自动跳过表头,只合并数据行 -
支持重复数据自动去除 -
合并后自动排序、自动调整列宽 -
不破坏原表,安全不覆盖
🚀 核心VBA代码(直接复制可用)
Alt+F11 打开VBA → 插入模块 → 粘贴:
Sub 批量合并所有工作表并去重()Dim ws As Worksheet, wsSum As WorksheetDim lastRow As Long, sumRow As LongDim colCount As IntegerDim dic As ObjectSet dic = CreateObject("Scripting.Dictionary")'新建汇总表On Error Resume NextApplication.DisplayAlerts = FalseSheets("汇总总表").DeleteApplication.DisplayAlerts = TrueOn Error GoTo 0Set wsSum = Sheets.Add(After:=Sheets(Sheets.Count))wsSum.Name = "汇总总表"sumRow = 1'遍历所有工作表For Each ws In WorksheetsIf ws.Name <> "汇总总表" ThenIf sumRow = 1 Then'复制表头ws.Rows(1).Copy wsSum.Rows(sumRow)sumRow = sumRow + 1colCount = ws.UsedRange.Columns.CountEnd If'复制数据行lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).RowIf lastRow >= 2 Thenws.Range(ws.Cells(2, 1), ws.Cells(lastRow, colCount)).Copy _wsSum.Cells(sumRow, 1)sumRow = sumRow + lastRow - 1End IfEnd IfNext ws'去重(以第1列为唯一标识)With wsSumlastRow = .Cells(.Rows.Count, 1).End(xlUp).RowFor i = lastRow To 2 Step -1keyStr = .Cells(i, 1).ValueIf dic.Exists(keyStr) Then.Rows(i).DeleteElsedic.Add keyStr, iEnd IfNext iEnd With'自动调整列宽wsSum.UsedRange.EntireColumn.AutoFitMsgBox "合并完成!" & Chr(13) & "共合并 " & Sheets.Count - 1 & " 个表" & Chr(13) & "去重后共 " & wsSum.Cells(Rows.Count, 1).End(xlUp).Row - 1 & " 条数据", vbOKOnlySet dic = NothingEnd Sub
📝 3步傻瓜式操作
- 准备数据
– 把所有要合并的表放在同一个Excel文件里– 所有表结构一致:表头相同、列顺序相同– 第一列作为唯一标识(如编号、姓名、单号) - 粘贴代码
– 按 Alt+F11– 插入 → 模块– 粘贴上面代码,直接运行 - 一键合并
– 运行宏: 批量合并所有工作表并去重– 自动生成「汇总总表」,完成去重+整理
💡 代码核心逻辑
-
自动新建汇总总表,不污染原数据 -
只复制一次表头,避免重复标题行 -
用字典快速去重,速度比删除重复项快几倍 -
自动适配列数,自动调整列宽,打开即用
⚠️ 必看注意事项1. 表结构必须统一:列数、表头、顺序必须一致2. 去重依据:默认按第一列去重,可自行修改列号3. 启用宏:打开文件必须启用宏,否则代码不执行4. 数据备份:重要文件先备份,避免误操作
夜雨聆风