ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 用字典嵌套统计

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-5-4 12:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
dsmch 发表于 2013-5-2 22:31
因表格是二维的,用行和列字段名完全可以用一个字典代替(以前没有发现)
当然,就这个例子也可以通过数组 ...

字典嵌套确实也是一种字典的用法,但几乎没有非此不可的漂亮实例。

更由于字典嵌套很容易造成不当占用内存而影响实际代码运行速度,
所以没有必要纠结于字典嵌套的使用……甚至可以说,应该尽量避免这种思路。

……
值得推荐的是字典+数组的用法。

因为VBA数组是效率最高的数据用法。
但缺点是只能通过行、列位置定位。
如果不能确定行、列位置,则需要遍历比对……这造成了效率浪费。

因此如果能够事先通过字典来进行关键词的快速定位,
然后再用数组来计算处理,则速度效率是最高的。


…………
附下面代码,可以确认到,字典查找毕竟比数组要慢很多的:
而且字典个数的k值越大,时间差异就越大……直至死机。
  1. Sub SpeedCompare()
  2.     Dim ii&, nn%, i&, k&, t&, s&
  3.     nn = 3
  4.     k = 1000
  5.    
  6.     Set d = CreateObject("Scripting.Dictionary")
  7.    
  8.     ReDim arr(1 To k, 1 To 2)
  9.     For i = 1 To k
  10.         t = Int(Rnd * 1000000)
  11.         arr(i, 1) = t
  12.         d(t) = i
  13.         arr(i, 2) = i
  14.     Next
  15.    
  16.     tms1 = Timer
  17.     For ii = 1 To 10 ^ nn
  18.         For i = 1 To k
  19.             t = arr(i, 1)
  20.             s = arr(i, 2)
  21.         Next
  22.     Next
  23.     tms2 = Timer
  24.     MsgBox Format(tms2 - tms1, "0.0000s")
  25.    
  26.     tms1 = Timer
  27.     For ii = 1 To 10 ^ nn
  28.         For i = 1 To k
  29.             t = arr(i, 1)
  30.             s = d(t)
  31.         Next
  32.     Next
  33.     tms2 = Timer
  34.     MsgBox Format(tms2 - tms1, "0.0000s")
  35.    
  36. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-5-4 13:01 | 显示全部楼层
事实上,字典可以看做是一种衍生工具,而并非基本必需品。

好的字典用法应该遵循如下原则:
1. 在使用字典之前,可能有必要先对原始数据进行整理。

2. 原则上应该一次循环就完成字典的建立,算法上尽量避免多次循环。

3. 在实际代码过程中,通过字典读取Item项目的过程也要控制到最少次数。
  

【反复读、写字典】这样的代码,基本上可以判断为不好的算法。

即,要把字典当做核武器那样,我有,但尽量不使用。这个才是最高的境界,
而这样写成的代码,才可能是好的算法。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-9 16:09 | 显示全部楼层
要把字典當核武器盡量不使用

這種說法真是妙
對於字典還是新手
學習依下

TA的精华主题

TA的得分主题

发表于 2013-5-9 23:58 | 显示全部楼层
我的字典对象使用经验谈贴可以看看,有不少使用字典嵌套的实际例子~

TA的精华主题

TA的得分主题

发表于 2013-5-10 09:00 | 显示全部楼层
虽说现在基本不必考虑资源紧张的问题,但速度也须考虑吧,1楼用了三个数组,和n+1个字典,实际上一个字典和一个数组就可以解决,占用资源少,速度也快:
  1. Sub Macro1()
  2. Dim arr, d As Object, i&, j&, k&, n&
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("a1").CurrentRegion
  5. n = 1
  6. For i = 2 To UBound(arr)
  7.   If d.exists(arr(i, 1)) Then
  8.     k = d(arr(i, 1))
  9.     For j = 2 To UBound(arr, 2)
  10.       arr(k, j) = arr(k, j) + arr(i, j)
  11.     Next
  12.     Else
  13.     n = n + 1
  14.     d(arr(i, 1)) = n
  15.     For j = 2 To UBound(arr, 2)
  16.       arr(n, j) = arr(i, j)
  17.     Next
  18.   End If
  19. Next
  20. Range("a15").Resize(n, UBound(arr, 2)) = arr
  21. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-20 16:24 | 显示全部楼层
字典统计可以提高运数速度,学习!

TA的精华主题

TA的得分主题

发表于 2013-6-11 10:26 | 显示全部楼层
一个案例,多种解法的分析优化,教学的好贴

TA的精华主题

TA的得分主题

发表于 2013-6-14 10:40 | 显示全部楼层
原来主要用于菜单、查询等,例子不够经典,开阔思路,支持

TA的精华主题

TA的得分主题

发表于 2014-11-15 19:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-4-13 22:23 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 15:11 , Processed in 0.049524 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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