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

VBA 字典 快速汇总匹配

Excel VBA练习 2021-07-15
1592

不知不觉,写了一个月了...之前好像直都没写关于字典数据聚合统计...


小编模拟了一个关于销售汇总并且匹配的题

数据源如下



如上图所示,AB列为A表数据源,DE列为B表数据源

现需对A表每个姓名分组统计,并且匹配B表中,查看差异

在此之前小编写了个关于VBA 字典 两表核对数据的例子,今天来撸下聚合统计匹配



代码如下

    Sub DicEx()
    Dim Dic As Object
    Dim aData, aRes
    Dim intX&, iRow&, x&
    On Error Resume Next '出错继续运行
    Set Dic = CreateObject("Scripting.Dictionary")
    aData = Range("a1").CurrentRegion '数据A表来源
    iRow = 1
    ReDim aRes(1 To UBound(aData), 1 To 4) '定义结果数组大小
    For intX = 2 To UBound(aData) '遍历循环数据源
    If Not Dic.exists(aData(intX, 1)) Then '字典中不包含关键字姓名
    iRow = iRow + 1 '累加结果行位置
    Dic(aData(intX, 1)) = iRow '姓名为Key结果行位置为Item存入字典
    aRes(iRow, 1) = aData(intX, 1) '写入结果数组中
    aRes(iRow, 2) = aData(intX, 2)
    aRes(iRow, 3) = 0 '初始化B表数据
    aRes(iRow, 4) = 0 '初识化差异
    Else
    x = Dic(aData(intX, 1)) '提取姓名对应的Item
    aRes(x, 2) = aRes(x, 2) + aData(intX, 2) '累加金额
    End If
    Next
    aData = Range("D1").CurrentRegion '数据B表来源
    For intX = 2 To UBound(aData)
    If Not Dic.exists(aData(intX, 1)) Then '再次判断,为避免B表无该销售员
    iRow = iRow + 1
    Dic(aData(intX, 1)) = iRow
    aRes(iRow, 1) = aData(intX, 1)
    aRes(iRow, 2) = 0
    aRes(iRow, 3) = aData(intX, 2)
    aRes(iRow, 4) = aRes(iRow, 2) - aRes(iRow, 3)
    Else
    x = Dic(aData(intX, 1))
    aRes(x, 3) = aRes(x, 3) + aData(intX, 2)
    aRes(x, 4) = aRes(x, 2) - aRes(x, 3)
    End If
    Next
    aRes(1, 1) = "姓名": aRes(1, 2) = "A表": aRes(1, 3) = "B表": aRes(1, 4) = "差异"
    Range("G1").Resize(iRow, UBound(aRes, 2)) = aRes '输出内容
    Set Dic = Nothing '释放字典内存
    End Sub
    复制


    代码解析

    第10至22行循环遍历A表数据源(AB列数据)

    第11行依然是判断字典中是否存在姓名关键字,不存在则将姓名作为Key,累加结果数组行位置作为对应的Item写入数组,并且将相关对应的数据源元素写入结果数组中

    在此,第16,17行的初始化0有点显得多余,为避免在B表中如果姓名未出现,该元素位置会为空值,而不是0,为此,多写两行初始化,毕竟,这点代码对电脑并无啥伤害...

    第19至20行,获取对应关键字在结果数组中的行位置,并且累加金额,也就是++++

    第24至37行循环遍历B表数据源(DE列)

    第25行依旧判断字典是否存在关键字,跟着和A表循环一致的步骤,不同的是这次写入差异,也就是对应行位置第2列的元素减去对应行位置第3列的元素,也就是差异

    ...


    如果是SQL也是可以的

    SQL语句如下

          strSQL1 = "Select 姓名 ,sum(销售金额) as A表 From " & strSource & " Group By 姓名 "
      strSQL2 = "Select 姓名 ,sum(销售金额) as B表 From " & strSource1 & " Group By 姓名"
      strSQL = "Select a.*,B表,A表-B表 as 差异 From (" & strSQL1 & ")a Left Join (" & strSQL2 & ")b On a.姓名=b.姓名"
      复制


      利用SQL中的Group By分组统计出AB表的总金额

      跟着使用Left Join 左连接 计算出差异

      关于左连接还是先见个面,明天开始撩~


      示例文件下载


      链接:https://pan.baidu.com/s/1vfEom3xVIbQbB6z0l_VtpQ

      提取码:abcd


      收工!

      如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下

      文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力

      关注公众号 ↓


      文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论