ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 求助一个字典解决若干列求和

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-1-28 21:48 | 显示全部楼层 |阅读模式
本帖最后由 手把手学习 于 2013-1-28 21:51 编辑

一段不错的宏代码帮了我不少的忙。但是现在要增加若干列,求助用一个字典能解决所有列的汇总吗? 条件汇总.rar (11.69 KB, 下载次数: 133)



TA的精华主题

TA的得分主题

发表于 2013-1-28 22:29 | 显示全部楼层
条件汇总.rar (16.77 KB, 下载次数: 167) 你原来的方法完善了,另又做一种,供参考

TA的精华主题

TA的得分主题

发表于 2013-1-28 22:37 | 显示全部楼层
楼主你的问题太简单了→幼儿园水平。

直接用=sumif()函数就全部OK啦。

请看附件:

条件汇总.rar

10.57 KB, 下载次数: 129

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-28 22:51 | 显示全部楼层
香川群子 发表于 2013-1-28 22:37
楼主你的问题太简单了→幼儿园水平。

直接用=sumif()函数就全部OK啦。

首先感谢你的回复。是的,我学习宏代码之前一直用函数解决的,问题是我这表有17列、12000行数据需要汇总,sumif()的速度不能和字典法相提并论的,其次是我非常喜欢学习字典法。

TA的精华主题

TA的得分主题

发表于 2013-1-28 22:55 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-1-28 22:56 | 显示全部楼层
本帖最后由 香川群子 于 2013-1-28 23:10 编辑

如果楼主想要学习字典用法,那么请看附件:
  1. Private Sub CommandButton1_Click()
  2.    
  3.     arr = [a1].CurrentRegion '获取A1单元格所在区域作为原始数据区域读入数组arr
  4.     m = UBound(arr): n = UBound(arr, 2) '获取原始数据区域行、列大小
  5.     ReDim brr(1 To m, 1 To n) '重新定义数组brr用来存放结果
  6.    
  7.     Set d = CreateObject("Scripting.Dictionary") '定义字典d用来记录关键词行位置指针
  8.    
  9.     For i = 2 To m '遍历数据有效行
  10.         t = d(arr(i, 1)) '用字典查询关键词(数据第1列)是否已经存入字典
  11.         If t = "" Then '如果结果为空白,则该关键字尚未加入字典 (注意,我没有使用d.Exists(关键词)的做法)
  12.             k = k + 1: d(arr(i, 1)) = k: t = k '新的行位置指针值k+1递增(即新添一个单词)、接着把该关键词加入字典、最后对t变量赋值=k指针
  13.             brr(k, 1) = arr(i, 1): brr(k, 2) = arr(i, 2) '把这个新单词的第1列、第2列内容写入结果数组
  14.         End If
  15.         For j = 3 To n '接下来,遍历第3列只到最后,把该关键词对应的统计数据加总到结果数组brr相应的行、列位置。
  16.             brr(t, j) = brr(t, j) + arr(i, j) '这里不管开始查询时字典内是否有这个关键词,最后都是以t变量为记录时行位置的指针。
  17.         Next
  18.     Next
  19.    
  20.     [h1].CurrentRegion.Offset(1) = "" '清空输出结果区域
  21.     [h2].Resize(k, n) = brr '输出结果到工作表指定区域
  22. End Sub
复制代码
我的算法是最高效的。没有其它。


按照楼主17列,12000行做了测试,VBA耗时0.2秒。

而sumif公式也是直接秒杀 → 楼主担心使用sumif函数耗时多,有何根据?


条件汇总2.rar (42.48 KB, 下载次数: 524)


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-1-28 22:57 | 显示全部楼层
注意,没有必要去定义变量,当然也不用去定义变量类型。

这个是很多VBA教师欺骗初学者的不良习惯。

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-28 23:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2013-1-28 22:57
注意,没有必要去定义变量,当然也不用去定义变量类型。

这个是很多VBA教师欺骗初学者的不良习惯。

这段经典的代码我收藏了。但是,老师能不能根据我的需求,在不改变浅绿色部分的情况下进行汇总呢?关键字不需要全部引用过来的,也就是说根据浅绿色部分的关键字进行汇总。

TA的精华主题

TA的得分主题

发表于 2013-1-28 23:12 | 显示全部楼层
字典+数组,是最快速、最高效的处理方法。

好的算法,比所谓养成一个定义变量类型的“好习惯”要有用的多。


TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-28 23:14 | 显示全部楼层
香川群子 发表于 2013-1-28 22:56
如果楼主想要学习字典用法,那么请看附件:我的算法是最高效的。没有其它。

特别感谢老师对这段代码的注释,对我们这些初学者来说是求之不得的事情。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-6 19:30 , Processed in 0.035511 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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