ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] VBA中集合collection方法的基础知识

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-7-4 12:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:数组集合和字典
感觉没有多大作用。。。

TA的精华主题

TA的得分主题

发表于 2013-7-4 12:25 | 显示全部楼层
bluexuemei 发表于 2013-7-4 12:21
感觉没有多大作用。。。

处理一维数组的时候比普通的数组方便。
比如将2组关键词依照一定的条件(例如不重复)合并为一组关键词。
写起来就比数组更加直观而且简单

TA的精华主题

TA的得分主题

发表于 2013-7-4 12:25 | 显示全部楼层
和字典差不多,但是字典是按照关键字来获取的,不能像集合一样访问指定的位置,比如s(2),字典就不得行
只能讲字典的关键字或者项,赋值给一个数组,然后再访问
各有各的优点和确定

点评

如果字典方法用前期绑定,就可以直接用dic.Item(2) 来获取对应位置的Item值了。  发表于 2013-7-4 13:15

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-4 12:47 | 显示全部楼层
本帖最后由 香川群子 于 2013-7-5 11:46 编辑

如果在Add集合元素时加入了唯一的key值,就可以了。
和普通数组相比较,集合的特点:
1. 通常只在末尾添加元素 (添加时不用考虑定义数组的大小,即集合中数组大小是自适应的)
    (也可以像插入工作表那样,在某个指定位置之前或之后插入,但意义似乎不大)
2. 不能改变已添加元素的内容
3. 可以任意删除指定位置(指定顺序位置/或指定key值)的元素
4. 不管如何添加和删除,集合中元素始终保持添加时的先后顺序不变

呵呵。

另外,和字典方法比较:
1. 集合中可以反复添加相同内容的信息(按顺序作为新元素添加)
   而字典的关键词是不可以重复的。(也可以说,是相当于以序号为关键词建立了字典)
2. 集合中元素可以Write in , 但不可以Rewrite
   (字典中key不可以改动,但Item可以任意改哦)


呵呵




TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-4 12:49 | 显示全部楼层
至于集合方法的使用,很遗憾,其实一般VBA应用都不是很需要。

但很意外,所有程序中无一例外地大量使用集合方法来对各种对象进行后台处理。

所以,几乎可以认为,集合虽然很不错,但面向终端用户的用处不大。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-4 13:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一个牵强的例子是:

不重复取值
  1. Sub test4()
  2.     Dim s As New Collection '定义集合s并初始化
  3.    
  4.     For i = 1 To 20
  5.         s.Add i '集合s中添加元素=i
  6.     Next
  7.    
  8.     For i = 1 To 10
  9.         r = Int(Rnd * s.Count + 1) '按当前集合s中元素总数.count范围随机取位置r
  10.         Debug.Print s(r) '输出本次抽取到的不重复值s(r)
  11.         s.Remove (r) '集合s中删去位置r的已抽取值s(r)
  12.         '可以简写为 s.Remove r  但注意不要写成s.Remove s(r)
  13.         '     →将会照成引用错误。即s(r)对应的位置可能已经不存在!  
  14.     Next
  15.    
  16. End Sub
复制代码
呵呵,仅作参考。

实际提取不重复值时,一般说毫无疑问应该使用【经典数组洗牌法】
因此本例仅为集合使用的体验,不能作为实际用例。



TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-4 13:34 | 显示全部楼层
felixyau 发表于 2013-7-4 12:25
和字典差不多,但是字典是按照关键字来获取的,不能像集合一样访问指定的位置,比如s(2),字典就不得行
...
  1. Sub test()
  2.     Shell ("Regsvr32 C:\Windows\System32\Scrrun.dll") 'Dos 下运行注册DLL
  3.     'Toos -> References -> Microsoft Scripting Runtime 'VBE中工具、引用
  4.     Dim dic As New Dictionary '前期绑定后就可以直接定义字典类型变量并初始化
  5.     For i = 1 To 10
  6.         dic(i) = i * 10
  7.     Next
  8.     t1 = dic.keys(2) '然后就可以直接读取第3个字典元素的关键词(注意字典数组是0开始)
  9.     t2 = dic.Items(2) '同样可以直接读取第3个字典元素的项目内容(注意字典数组是0开始)
  10. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-7-4 14:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2013-7-4 14:34 编辑

捕获.JPG

点评

给个链接,大家方便。另外,没有讲在标准模块与类模块中,Collection的区别  发表于 2014-1-10 09:53

TA的精华主题

TA的得分主题

发表于 2013-7-4 14:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
集合不可以是2维或多维的吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-4 16:34 | 显示全部楼层
前面讲了常识性的东西。

下面继续,稍微有点变化了。

集合添加时增加检索用关键词的方法,
以及集合添加时改变顺序的方法:
Sub test5()
    Dim s As New Collection
   
    s.Add 1, CStr(1)
    For i = 2 To 20 Step 2
        s.Add i, CStr(i), Int(Rnd * (i - 1) + 1)
        s.Add i + 1, CStr(i + 1), , Int(Rnd * i + 1)
    Next
    For i = 1 To 20
        t1 = s.Item(i) '按现在的顺序返回集合元素
        t2 = s.Item(CStr(i)) '按关键词key返回集合元素
    Next
End Sub

呵呵,这个有点复杂了,

实际上一般用不到。因为需要这些功能时,人们就会直接去用字典方法了。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-19 16:00 , Processed in 0.044592 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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