ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 致字典新人-关于字典使用的两种基础方法的示例

致字典新人-关于字典使用的两种基础方法的示例

作者:绿色风 分类: 时间:2022-08-18 浏览:86
楼主
xmyjk
字典用处非常多,汇总,取不重复值,筛选取数,制作数据有效性等等用法,但是,其核心均是利用字典关键字不重复和关键字同键值相互匹配的特性,主要使用方法有以下两种:

用一个案例来说明:如下图,筛选部门的唯一值,并汇总其对应的收入。


 
字典问题.rar
2楼
xmyjk
做法一:最常见的一种基本用法,利用d("key")的特性,当使用d("key")key在字典中存在的话,就调用出其对应的值,当key不存在的话,则建立该key,对应值为空。


  1. Sub samesum1()
  2. Dim i As Integer, n As Integer, arr()
  3. Dim d, k, t

  4. Set d = CreateObject("Scripting.Dictionary") '建立字典对象
  5. n = [a65536].End(xlUp).Row '取得数据的最后一行行数
  6. arr = Range("a2:b" & n) '将除第一行以外数据导入数组arr

  7. '字典有个特性,d("张三"),如果字典里有关键字张三,就出来张三对应的值,没有的话,就创建一个张三的关键字,对应空值
  8. For i = 1 To UBound(arr) '历遍数组的第一列
  9.     d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) '利用字典关键字不重复性,将相同项目加总,PS:如求重复次数用1
  10. Next
  11. k = d.keys '导出字典的关键字
  12. t = d.items '导出字典的值

  13. Columns("e:f").Clear
  14. [e2].Resize(d.Count, 1) = Application.Transpose(k) '将关键字写入表二的A列
  15. [f2].Resize(d.Count, 1) = Application.Transpose(t) '将加总值写入表二的B列
  16. [e1].Resize(1, 2) = Array("字段", "求和") '做表头

  17. Erase k, t, arr '释放数组
  18. Set d = Nothing '释放对象
  19. End Sub



字典使用讲解-方法1.rar
3楼
xmyjk
做法2:这种方法主要是利用字典来记录原始数据中,所需的结果数据的坐标,然后再依据记录的坐标,导出记录。
或者是,用字典来记录结果数组的坐标,以便后续操作使用。前者非常简单不做示例了,我们用上面的案例用来演示后者,参考代码如下。



  1. Sub samesum2()
  2. Dim i As Integer, n As Integer, arr(), brr(), nm As Integer
  3. Dim d

  4. Set d = CreateObject("Scripting.Dictionary") '建立字典对象
  5. n = [a65536].End(xlUp).Row '取得表1最后一行行数
  6. arr = Range("a2:b" & n) '将表一除第一行以外数据导入数组arr

  7. nm = 0 '计数器归零
  8. For i = 1 To UBound(arr) '历遍arr数组的第一列
  9.    If Not (d.exists(arr(i, 1))) Then '测试关键字是否存在于字典内
  10.       nm = nm + 1 '关键字不存在的话,计数器加1
  11.       ReDim Preserve brr(1 To 2, 1 To nm) '增加brr数组列数,由于redim只能改变最后一维的维数,采用类似转置方式来定义brr
  12.       d(arr(i, 1)) = nm '记住新关键字所对应位于brr数组的列号
  13.       brr(1, nm) = arr(i, 1): brr(2, nm) = arr(i, 2) '将数据导入brr的新增列中
  14.    Else
  15.       brr(2, d(arr(i, 1))) = brr(2, d(arr(i, 1))) + arr(i, 2) '如果关键字存在,则利用字典所记住的相关关键字对应brr的列号,将brr相关列的值累加
  16.    End If
  17. Next

  18. Columns("e:f").Clear
  19. [e2].Resize(UBound(brr, 2), UBound(brr, 1)) = Application.Transpose(brr) '将brr转置后导入单元格
  20. [e1].Resize(1, 2) = Array("字段", "求和") '做表头
  21. Set d = Nothing '释放对象变量
  22. Erase arr, brr '释放数组
  23. End Sub

字典使用讲解-方法2.rar
4楼
xmyjk
总之,第一种用法简单,常常用于初级汇总或多条件汇总。
第二种方法不要小看它,利用一个字典一个数组,广泛用于筛选和提取数据(比如将乱序的多日数据汇总)的用法。
5楼
余方方
学习啦,谢谢
6楼
bluexuemei
第二种方法有些复杂,能看懂,但是自己写的话不一定会写!

免责声明

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

评论列表
sitemap