今天,小编在群里有看到有网友问如何将多个不同标题顺序的工作表 汇总成一张总表
在这之前小编有写过关于合并工作表的文章
SQL Connection对象的OpenSchema方法 不打开工作簿合并工作表
也有任意列拆分工作表
有兴趣的小伙伴可以去看看
这次我们使用字典来合并,关于不同标题顺序合并就需要用到字典中的的定位功能了...
如下图所示
这是一份不知道哪里来的数据,每张表的表头字段都不一样…

代码如下:
Sub GetData(control As IRibbonControl)Call Dic_JoinShtEnd SubSub Dic_JoinSht()Dim Dic As ObjectDim Sht As WorksheetDim iRow&, iCol&, intX&, intY&, y&Dim aData, aResOn Error Resume NextSet Dic = CreateObject("Scripting.Dictionary")Application.ScreenUpdating = False '取消闪屏弹窗Application.DisplayAlerts = FalseWorksheets("汇总表").Delete '删除汇总表With Sheets.Add(after:=Sheets(Sheets.Count)) '新建一个工作表,并且命名为汇总表.Name = "汇总表"End WithWith Worksheets("汇总表").Cells(1, 1) = "工作表名称"iCol = 1 '初始化计数器For Each Sht In Worksheets '遍历循环工作表If Sht.Name <> .Name ThenIf Not IsEmpty(Sht.UsedRange) Then '判断是否空表If Sht.AutoFilterMode = True Then Sht.Cells.AutoFilter '取消筛选aData = Sht.Range("A1").CurrentRegion '获取数据源ReDim aRes(1 To UBound(aData) - 1, 1 To iCol) '定义结果数组大小For intY = 1 To UBound(aData, 2)If Not Dic.exists(aData(1, intY)) Then '判断标题关键字是否存在字典iCol = iCol + 1Dic(aData(1, intY)) = iCol '标题为关键字,所在结果数组列位置为条目 存入字典If iCol > UBound(aRes, 2) Then ReDim Preserve aRes(1 To UBound(aRes), 1 To iCol)'判断列位置是否大于结果数据列维度,符合条件使用ReDim Preserve调整结果数组的大小End Ify = Dic(aData(1, intY)) '标题所在结果数组中的列位置For intX = 2 To UBound(aData) '遍历行aRes(intX - 1, y) = aData(intX, intY) '数据元素存入结果数组NextNextFor intX = 1 To UBound(aRes)aRes(intX, 1) = Sht.Name '存入工作表名称NextEnd If.Cells(.Cells(Rows.Count, 1).End(3).Row + 1, 1).Resize(UBound(aRes), UBound(aRes, 2)) = aRes '在数据最后的行位置输入结果数组内容End IfNext.Cells(1, 2).Resize(, Dic.Count) = Dic.keys '输出标题.UsedRange.Borders.LineStyle = 1 '添加边框.Columns.AutoFit '自适应列宽.Cells(2, 1).SelectActiveWindow.FreezePanes = True '冻结窗格ActiveWindow.DisplayGridlines = FalseEnd WithApplication.DisplayAlerts = True '恢复系统设置Application.ScreenUpdating = True '取消网格线Set Dic = Nothing '释放End Sub
第1至第3行是小编做的Ribbon按钮,放置在选项卡中方便点击

第12至13行取消闪屏以及弹窗
第14至17行删除汇总表后再次创建一个新的汇总表,由于第10行有了容错处理,这样图方便...
第21至45行遍历当前工作簿的所有工作表
第22行判断是否与汇总表不一致
第23行判断是否为空表
第24行判断是否有筛选,有则取消筛选
第27至38行遍历数据源,先遍历列在遍历行
第28行至33行判断字典中是否存在标题关键字,如没有则累加计数器,并且将标题作为Key结果数组的列位置Item存入字典中
第34行取出关键字标题所在结果数组中的列位置
第35行至37行循环数据源的行,将数据源的元素存入到结果数组中
第39行至41行存入工作表名称
第43行输出结果数组的内容
第46行输出标题
第47行至51行设置汇总表格式等
第53至55恢复系统设置释放字典内存
示例文件下载
链接:https://pan.baidu.com/s/1PePUgyyUGX6ckBc24a2C4A
提取码:abcd
收工!
如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下
文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力
关注公众号 ↓
文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




