ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 如何利用字典对多列复杂数据进行汇总?

如何利用字典对多列复杂数据进行汇总?

作者:绿色风 分类: 时间:2022-08-18 浏览:110
楼主
kevinchengcw
Q: 如何利用字典对多列复杂数据进行汇总?
A: 对于存在多列数据,要根据多个条件求出符合要求的结果,下述示例给出了一个示范效果,代码如下:
  1. Sub test()
  2. Dim Dic, Arr, Arr2
  3. Dim M, N, I As Long
  4. Dim Str, Str2 As String
  5. Set Dic = CreateObject("scripting.dictionary")  '创建字典
  6. With Worksheets("数据源")
  7.     For N = 3 To .Cells(.Rows.Count, 2).End(3).Row   '循环取数据源中各行数据
  8.         If Year(.Cells(N, 3).Value) = Worksheets("汇总").[e1].Value And Month(.Cells(N, 3).Value) = Worksheets("汇总").[g1].Value Then  '判断日期是否符合汇总表中的设定
  9.             Str = .Cells(N, 1).Value & vbTab & .Cells(N, 2).Value & vbTab & Format(.Cells(N, 3).Value, "yyyy-m-d")  '创建字典的key字段,通过前三列依特定字符的方式,形成同一代码的同一门店的同一日期的唯一性
  10.             If Dic.exists(Str) Then   '判断是否已有该项记录,有则更新字典对应的item项
  11.                 Arr = Split(Dic(Str), vbTab)  '方法是将item项先拆分放入数组,将对应项与对应单元格的值相加
  12.                 For M = LBound(Arr) To UBound(Arr)   '循环操作数组中对应项
  13.                     Arr(M) = Arr(M) + .Cells(N, M + 4).Value  '与对应单元格的值相加
  14.                 Next M
  15.                 Dic(Str) = Join(Arr, vbTab)  '完成后再将数组用用特定字符串接起来赋值给字典对应的item项
  16.                 Erase Arr  '清空数组,防止出错
  17.             Else   '如果没有该字典项存在,则
  18.                 For M = 4 To 10   '将D列到J列的数据用特定字符串接后作为item项,与前面串接的key一起赋值给字典
  19.                     If M = 4 Then
  20.                         Str2 = .Cells(N, M).Value
  21.                     Else
  22.                         Str2 = Str2 & vbTab & .Cells(N, M).Value
  23.                     End If
  24.                 Next M
  25.                 Dic.Add Str, Str2
  26.             End If
  27.         End If
  28.     Next N
  29. End With
  30. Arr = Dic.keys  '将字典的keys赋值给数组,方便取用
  31. N = 4  '设定汇总页的起始行,如果要连续汇总的话,这里可以改成对有数据行数的判断
  32. With Worksheets("汇总")   '对汇总页进行操作
  33.     For M = LBound(Arr) To UBound(Arr)   '逐个提取数组中项目
  34.         Arr2 = Split(Arr(M) & vbTab & Dic(Arr(M)), vbTab)   '将字典的key项(已赋值给数组)和item项依同样的特定字符串接后再拆分赋值给数组2
  35.         For I = LBound(Arr2) To UBound(Arr2)  '循环将数组内容写入对应的汇总页内的单元格中
  36.             .Cells(N, I + 1) = Arr2(I)
  37.         Next I
  38.         N = N + 1  '下移一行
  39.         Erase Arr2    '清空数组,防止出错
  40.     Next M
  41. End With
  42. MsgBox "汇总完成", vbOKOnly, ""    '显示提示信息
  43. End Sub


通过对字典的灵活运用,并且与数组良好配合,可以轻松实现这样复杂的统计工作.

附示例文件.
多列多要求汇总实例.rar
2楼
wnianzhong
VBA高手,学习了!
3楼
lgb6699
非常简洁清晰的示例,感谢KevinChengCW,许多帖子对字典的说明都让新手头疼,向版主这种操作实力的解说有亲和力,谢谢,努力学习.
4楼
开心萝卜
谢谢分享!等有基础了再看
5楼
mjgdxx
唉,都没懂字典是什么意思
6楼
liumporite
好东西,顶
7楼
余方方
好东西,学习了,谢谢
8楼
ljx63426
字典是什么意思
9楼
eylin
学习了,真的是解决了大问题,谢谢!
10楼
pjack2001
学习了!
11楼
吾股丰登
                Arr = Split(Dic(Str), vbTab)  '方法是将item项先拆分放入数组,将对应项与对应单元格的值相加

                For M = LBound(Arr) To UBound(Arr)   '循环操作数组中对应项

                    Arr(M) = Arr(M) + .Cells(N, M + 4).Value  '与对应单元格的值相加

============================
上面这地方一直没理解过来  郁闷
12楼
wzq47111
学习了
13楼
bensonlei
附件讲得很好!
14楼
glxarjwsyqcc
非常简洁清晰的示例,感谢KevinChengCW,许多帖子对字典的说明都让新手头疼,向版主这种操作实力的解说有亲和力,谢谢,努力学习.
15楼
gysegz
K哥真的牛
16楼
tiger2003
学习了,谢谢!
17楼
E林好汉
谢谢分享!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap