ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 字典基本语句、以及中级字典运用例子

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-25 22:07 | 显示全部楼层
本帖已被收录到知识树中,索引项:数组集合和字典
收藏,学习,谢谢楼主!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-26 00:22 | 显示全部楼层
在下面帖子的27楼中,我使用了中级字典用法:【字典记录用作索引】
http://club.excelhome.net/forum. ... 387&pid=7868650

题目要求:
A列中的数值,统计相同值的个数,并按从小到大顺序分列输出。
  1. Sub test9() '27L kagawa-1
  2.     Dim ar, br, cr, dic, i&, j&, k&, m&, n&, s
  3.    
  4.     ar = [a1].CurrentRegion
  5.     ReDim br(2, UBound(ar))
  6.    
  7.     Set dic = CreateObject("Scripting.Dictionary")
  8.     For i = 1 To UBound(ar)
  9.         s = ar(i, 1) 'A列值s、作为字典关键字key
  10.         j = dic(s)   '字典返回其索引值j
  11.         If j = 0 Then '如 j =0 则字典中该key为空 即s尚未存入字典
  12.             k = k + 1: dic(s) = k: j = k '于是新增索引值k+1 并作为s的索引值存入字典
  13.             '下面是比较插入排序
  14.             For m = 1 To k - 1
  15.                 If br(2, m) > s Then '检查到比当前值更大位置时
  16.                     For n = k To m + 1 Step -1 '倒序移动更大的值
  17.                         br(2, n) = br(2, n - 1)
  18.                         br(1, n) = br(1, n - 1)
  19.                     Next
  20.                     Exit For '腾出新位置后退出
  21.                 End If
  22.             Next
  23.             br(2, m) = s: br(1, m) = k '在新位置插入新值
  24.         End If
  25.         br(0, j) = br(0, j) + 1 '在数组br中统计关键字s对应的个数
  26.         ' 【直接使用字典做统计时,一般是 dic(s) = dic(s) + 1 即可】 但注意字典需要多引用一次。所以速度效率略低。
  27.     Next
  28.    
  29.     [c1].CurrentRegion = ""
  30.     For j = 1 To k
  31.         Cells(1, 2 + j).Resize(br(0, br(1, j))) = br(2, j)
  32.     Next
  33. End Sub
复制代码
本例虽然使用了字典,但并不用足……
仅仅把字典用作对关键字进行位置索引的关联,
而把统计个数等其它的处理,仍然交给数组去完成。

因为数组的速度效率是最高的。

呵呵。虽然代码复杂了一点,但思路值得学习。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-9-26 10:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-9-26 11:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-9-26 12:34 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-26 12:41 | 显示全部楼层
小花鹿 发表于 2014-9-26 12:34
很难想象,VBA中如果没有字典会怎样。

用数组就可以了。

字典只是在减少循环遍历上有特别的优势。但并非不可缺少的工具。
(当然,既然有了这个利器,不用就是傻。)


而不允许使用数组功能,才会是天大的灾难。

点评

解释可谓是画龙点睛  发表于 2014-11-14 15:13
搞清楚二者的辩证关系了……  发表于 2014-9-26 13:01

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-26 12:43 | 显示全部楼层
小花鹿 发表于 2014-9-26 12:34
很难想象,VBA中如果没有字典会怎样。

或者也可以这么看:

字典事实上也就是一个哈希散列数组。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-9-26 14:17 | 显示全部楼层
太好了,正要找学习资料,收藏了,谢谢!

TA的精华主题

TA的得分主题

发表于 2014-9-26 14:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
收藏一下,以后学习

TA的精华主题

TA的得分主题

发表于 2014-9-26 16:06 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 04:26 , Processed in 0.032805 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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