ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5120|回复: 17

[分享] 用字典求和

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-5-8 14:07 | 显示全部楼层 |阅读模式
本帖最后由 little-key 于 2017-5-8 14:12 编辑

最近写VBA 上瘾,特地重新温习一下字典和数组的用法,之前很多时候只学习代码,稍微修改一下,这次要理解和自己写一些,将用字典求和的心得分享给大家一下。

01.jpg

上图是用字典写的一个简单求和,这个其实类似于数据透视表,第一步获取城市的唯一值,然后根据每个城市汇总【数值】项目,代码如下:

  1. Sub 求和()
  2. Dim arr, d As Object, nr&, i&, m&                                              定义变量
  3. nr = Range("A65536").End(xlUp).Row                                     找到A列最后一个非空单元格的行数,为了下方或者整个区域,虽然用CurrentRegion也可以,但是需要剔除标题行,所以建议用这个的方法,即End函数
  4. arr = Range("A2").Resize(nr, 2)                                                为数组arr赋值,即将A、B的数据赋予到arr这个数组中
  5. Set d = CreateObject("scripting.dictionary")                             建立字典,通过set的方法,可以不用通过【选项】——【引用】
  6. For i = 1 To nr - 1                                                                     历遍数组,其实这个nr-1也可以使用Ubound函数来代替
  7. d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) '求和                                    字典中的key存在时,则自动加上B列对应的值,这个对应的值就是key,利用的就是字典中key的唯一性这个特性
  8. 'd(arr(i, 1)) = d(arr(i, 1)) + 1 '计数                                             这个是计数的算法,自动加1
  9. Next i                                                                                        循环结束
  10. Range("E1").CurrentRegion.Offset(1).ClearContents                 清除结果区域的数据
  11. m = d.Count                                                                             m返回的是字典的key的个数
  12. Range("E2").Resize(m) = Application.Transpose(d.keys)            将字典的key全部返回到E2单元格开始的区域,区域的长度就是字典key 的个数,这个注意的是,需要使用Transpose函数,转置一下才可以形成一个列字典
  13. Range("F2").Resize(m) = Application.Transpose(d.Items)           将字典中的Items,即key对应的值,返回到F2单元格开始的区域,长度还是key的个数
  14. Set d = Nothing                                                                         将d这个对象清空
  15. End Sub
复制代码
使用字典求和,有这么几个好处,一个是速度很快,其次,key的排序是按照原来数据的排序来的,再次,利用了key的唯一性这个特性,可以很快的提取唯一值。

以上只是抛砖引玉,大家可以互相讨论一下。

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-5-8 14:11 | 显示全部楼层
值得肯定,只有通过自身学习才能真正解决问题。
变通建议:关于提到使用CurrentRegion问题,其实可以考虑使用Usedrange,行数从第二行读起(就跳过了标题了),再加上是否为空来跳过中间或者结尾时出现的已使用过的空行

TA的精华主题

TA的得分主题

发表于 2017-5-8 14:13 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-5-8 14:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢版主的分享,路过学习

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-8 14:23 | 显示全部楼层
microyip 发表于 2017-5-8 14:11
值得肯定,只有通过自身学习才能真正解决问题。
变通建议:关于提到使用CurrentRegion问题,其实可以考虑 ...

使用UsedRange会有一个问题,就是右边还有一个字段,如果使用了UsedRange,那区域就包括了右边的字段区域了

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-8 14:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liucqa 发表于 2017-5-8 14:13
这个代码只能在2003下使用

不仅仅在2003下可以使用,刚才我用的就是2010环境的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-8 14:24 | 显示全部楼层
LMY123 发表于 2017-5-8 14:14
感谢版主的分享,路过学习

活到老,学到老
其实字典以前学过,但是后来忘记了这个工具了,现在重新捡起来

TA的精华主题

TA的得分主题

发表于 2017-5-8 15:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
little-key 发表于 2017-5-8 14:23
不仅仅在2003下可以使用,刚才我用的就是2010环境的。

3楼大神说只能在03环境下使用,是指 Transpose 函数 超过 65535 数据行会出错。


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-5-8 15:48 | 显示全部楼层
突然发现,楼上所有的人都是神级人物,帖子都是以万来计算的。

TA的精华主题

TA的得分主题

发表于 2017-5-8 16:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liucqa 发表于 2017-5-8 14:13
这个代码只能在2003下使用

你说的是Transpose不能超过65536行吧?只要数据不超过65536行,其它版本也能用的。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-25 14:25 , Processed in 0.041553 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表