|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 little-key 于 2017-5-8 14:12 编辑
最近写VBA 上瘾,特地重新温习一下字典和数组的用法,之前很多时候只学习代码,稍微修改一下,这次要理解和自己写一些,将用字典求和的心得分享给大家一下。
上图是用字典写的一个简单求和,这个其实类似于数据透视表,第一步获取城市的唯一值,然后根据每个城市汇总【数值】项目,代码如下:
- Sub 求和()
- Dim arr, d As Object, nr&, i&, m& 定义变量
- nr = Range("A65536").End(xlUp).Row 找到A列最后一个非空单元格的行数,为了下方或者整个区域,虽然用CurrentRegion也可以,但是需要剔除标题行,所以建议用这个的方法,即End函数
- arr = Range("A2").Resize(nr, 2) 为数组arr赋值,即将A、B的数据赋予到arr这个数组中
- Set d = CreateObject("scripting.dictionary") 建立字典,通过set的方法,可以不用通过【选项】——【引用】
- For i = 1 To nr - 1 历遍数组,其实这个nr-1也可以使用Ubound函数来代替
- d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) '求和 字典中的key存在时,则自动加上B列对应的值,这个对应的值就是key,利用的就是字典中key的唯一性这个特性
- 'd(arr(i, 1)) = d(arr(i, 1)) + 1 '计数 这个是计数的算法,自动加1
- Next i 循环结束
- Range("E1").CurrentRegion.Offset(1).ClearContents 清除结果区域的数据
- m = d.Count m返回的是字典的key的个数
- Range("E2").Resize(m) = Application.Transpose(d.keys) 将字典的key全部返回到E2单元格开始的区域,区域的长度就是字典key 的个数,这个注意的是,需要使用Transpose函数,转置一下才可以形成一个列字典
- Range("F2").Resize(m) = Application.Transpose(d.Items) 将字典中的Items,即key对应的值,返回到F2单元格开始的区域,长度还是key的个数
- Set d = Nothing 将d这个对象清空
- End Sub
复制代码 使用字典求和,有这么几个好处,一个是速度很快,其次,key的排序是按照原来数据的排序来的,再次,利用了key的唯一性这个特性,可以很快的提取唯一值。
以上只是抛砖引玉,大家可以互相讨论一下。
|
评分
-
4
查看全部评分
-
|