暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA 字典 多表不同标题顺序 使用字典定位来合并工作表真的很简单

Excel VBA练习 2021-07-15
2641

今天,小编在群里有看到有网友问如何将多个不同标题顺序的工作表 汇总成一张总表


在这之前小编有写过关于合并工作表的文章

SQL Connection对象的OpenSchema方法 不打开工作簿合并工作表

也有任意列拆分工作表

VBA 字典 指定列拆分表

有兴趣的小伙伴可以去看看


这次我们使用字典来合并,关于不同标题顺序合并就需要用到字典中的的定位功能了...


如下图所示

这是一份不知道哪里来的数据,每张表的表头字段都不一样…



代码如下:


    Sub GetData(control As IRibbonControl)
    Call Dic_JoinSht
    End Sub


    Sub Dic_JoinSht()
    Dim Dic As Object
    Dim Sht As Worksheet
    Dim iRow&, iCol&, intX&, intY&, y&
    Dim aData, aRes
    On Error Resume Next
    Set Dic = CreateObject("Scripting.Dictionary")
    Application.ScreenUpdating = False '取消闪屏弹窗
    Application.DisplayAlerts = False
    Worksheets("汇总表").Delete '删除汇总表
    With Sheets.Add(after:=Sheets(Sheets.Count)) '新建一个工作表,并且命名为汇总表
    .Name = "汇总表"
    End With
    With Worksheets("汇总表")
    .Cells(1, 1) = "工作表名称"
    iCol = 1 '初始化计数器
    For Each Sht In Worksheets '遍历循环工作表
    If Sht.Name <> .Name Then
    If 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 + 1
    Dic(aData(1, intY)) = iCol '标题为关键字,所在结果数组列位置为条目 存入字典
    If iCol > UBound(aRes, 2) Then ReDim Preserve aRes(1 To UBound(aRes), 1 To iCol)
    '判断列位置是否大于结果数据列维度,符合条件使用ReDim Preserve调整结果数组的大小
    End If
    y = Dic(aData(1, intY)) '标题所在结果数组中的列位置
    For intX = 2 To UBound(aData) '遍历行
    aRes(intX - 1, y) = aData(intX, intY) '数据元素存入结果数组
    Next
    Next
    For intX = 1 To UBound(aRes)
    aRes(intX, 1) = Sht.Name '存入工作表名称
    Next
    End If
    .Cells(.Cells(Rows.Count, 1).End(3).Row + 1, 1).Resize(UBound(aRes), UBound(aRes, 2)) = aRes '在数据最后的行位置输入结果数组内容
    End If
    Next
    .Cells(1, 2).Resize(, Dic.Count) = Dic.keys '输出标题
    .UsedRange.Borders.LineStyle = 1 '添加边框
    .Columns.AutoFit '自适应列宽
    .Cells(2, 1).Select
    ActiveWindow.FreezePanes = True '冻结窗格
    ActiveWindow.DisplayGridlines = False
    End With
    Application.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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论