作者:绿色风
分类:
时间:2022-08-18
浏览:122
楼主 xmyjk |
字典用处非常多,汇总,取不重复值,筛选取数,制作数据有效性等等用法,但是,其核心均是利用字典关键字不重复和关键字同键值相互匹配的特性,主要使用方法有以下两种:
用一个案例来说明:如下图,筛选部门的唯一值,并汇总其对应的收入。
字典问题.rar |
2楼 xmyjk |
做法一:最常见的一种基本用法,利用d("key")的特性,当使用d("key")key在字典中存在的话,就调用出其对应的值,当key不存在的话,则建立该key,对应值为空。
- Sub samesum1()
- Dim i As Integer, n As Integer, arr()
- Dim d, k, t
- Set d = CreateObject("Scripting.Dictionary") '建立字典对象
- n = [a65536].End(xlUp).Row '取得数据的最后一行行数
- arr = Range("a2:b" & n) '将除第一行以外数据导入数组arr
- '字典有个特性,d("张三"),如果字典里有关键字张三,就出来张三对应的值,没有的话,就创建一个张三的关键字,对应空值
- For i = 1 To UBound(arr) '历遍数组的第一列
- d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) '利用字典关键字不重复性,将相同项目加总,PS:如求重复次数用1
- Next
- k = d.keys '导出字典的关键字
- t = d.items '导出字典的值
- Columns("e:f").Clear
- [e2].Resize(d.Count, 1) = Application.Transpose(k) '将关键字写入表二的A列
- [f2].Resize(d.Count, 1) = Application.Transpose(t) '将加总值写入表二的B列
- [e1].Resize(1, 2) = Array("字段", "求和") '做表头
- Erase k, t, arr '释放数组
- Set d = Nothing '释放对象
- End Sub
字典使用讲解-方法1.rar |
3楼 xmyjk |
做法2:这种方法主要是利用字典来记录原始数据中,所需的结果数据的坐标,然后再依据记录的坐标,导出记录。 或者是,用字典来记录结果数组的坐标,以便后续操作使用。前者非常简单不做示例了,我们用上面的案例用来演示后者,参考代码如下。
- Sub samesum2()
- Dim i As Integer, n As Integer, arr(), brr(), nm As Integer
- Dim d
- Set d = CreateObject("Scripting.Dictionary") '建立字典对象
- n = [a65536].End(xlUp).Row '取得表1最后一行行数
- arr = Range("a2:b" & n) '将表一除第一行以外数据导入数组arr
- nm = 0 '计数器归零
- For i = 1 To UBound(arr) '历遍arr数组的第一列
- If Not (d.exists(arr(i, 1))) Then '测试关键字是否存在于字典内
- nm = nm + 1 '关键字不存在的话,计数器加1
- ReDim Preserve brr(1 To 2, 1 To nm) '增加brr数组列数,由于redim只能改变最后一维的维数,采用类似转置方式来定义brr
- d(arr(i, 1)) = nm '记住新关键字所对应位于brr数组的列号
- brr(1, nm) = arr(i, 1): brr(2, nm) = arr(i, 2) '将数据导入brr的新增列中
- Else
- brr(2, d(arr(i, 1))) = brr(2, d(arr(i, 1))) + arr(i, 2) '如果关键字存在,则利用字典所记住的相关关键字对应brr的列号,将brr相关列的值累加
- End If
- Next
- Columns("e:f").Clear
- [e2].Resize(UBound(brr, 2), UBound(brr, 1)) = Application.Transpose(brr) '将brr转置后导入单元格
- [e1].Resize(1, 2) = Array("字段", "求和") '做表头
- Set d = Nothing '释放对象变量
- Erase arr, brr '释放数组
- 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总版主之一