不知不觉,写了一个月了...之前好像一直都没写关于字典数据聚合统计...
小编模拟了一个关于销售汇总并且匹配的题
数据源如下
如上图所示,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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
2393次阅读
2025-04-09 15:33:27
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1107次阅读
2025-04-27 16:53:22
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
794次阅读
2025-04-10 15:35:48
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
612次阅读
2025-04-30 15:24:06
数据库,没有关税却有壁垒
多明戈教你玩狼人杀
552次阅读
2025-04-11 09:38:42
天津市政府数据库框采结果公布,7家数据库产品入选!
通讯员
537次阅读
2025-04-10 12:32:35
国产数据库需要扩大场景覆盖面才能在竞争中更有优势
白鳝的洞穴
521次阅读
2025-04-14 09:40:20
最近我为什么不写评论国产数据库的文章了
白鳝的洞穴
484次阅读
2025-04-07 09:44:54
一页概览:Oracle GoldenGate
甲骨文云技术
440次阅读
2025-04-30 12:17:56
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
438次阅读
2025-04-17 17:02:24