ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-7-4 11:31 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数组集合和字典
本帖最后由 香川群子 于 2013-7-4 13:09 编辑

刚刚有新手在问 Collection是什么意思?……

于是有了下面的代码介绍:



  1. Sub test()
  2. '    Dim s As Collection '定义s变量为集合对象
  3. '    Set s = New Collection '初始化集合对象s (否则无法使用)

  4.     Dim s As New Collection '推荐这句代码,直接初始化,可以不用再Set了

  5.     '集合s中添加元素的方法
  6.     For i = 1 To 10
  7.         s.Add i '对于集合s,用Add方法可以加入集合元素
  8.             '当然事实上你可以添加任意内容来代替本例中的i
  9.     Next


  10.     '读取集合中元素的方法   
  11.     For i = 1 To s.Count '可以用Count属性返回集合中元素总个数
  12.         t = s(i) '读取集合s中第i个变量存入临时变量t中
  13.         t = s.Item(i) '正规的代码写法应该是这样子(效果一样,推荐用上一句更简明)
  14.         Debug.Print s(i) '在立即窗口中观察s(i)的值
  15.     Next
  16.    
  17.     '下面是集合s中元素删除的方法
  18.     For i = 1 To s.Count '遍历集合元素
  19.         s.Remove (1) '每次删去第1个……直至全部删除完毕 或直接简写为: s.Remove 1
  20. '        s.Remove (s.Count) '或者每次删除最后一个,直至全部删除完毕(推荐用上一句,不容易错)
  21. '        或简写为 s.Remove s.Count      
  22.         Debug.Print s.Count '在立即窗口中观察集合s中剩余元素个数
  23.     Next
  24.    
  25. End Sub
复制代码

评分

14

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-7-4 11:41 | 显示全部楼层
楼主写的注释太详细了,真让人汗颜

TA的精华主题

TA的得分主题

发表于 2013-7-4 11:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
跟着群子学集合。能不能来几个适合用集合来解决问题的例子?

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-4 11:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
集合是什么?

集合是用户定制的一组数据信息,存放于一个一维数组中,以便用户随时访问、增添、删除同类信息。


这个集合的定义,完全是由用户做主,对集合中的数据类型,没有任何限制……
完全取决于用户是否愿意根据某些自己确定的规则把符合要求的信息内容加入集合。

即,集合中元素可以是各种类型的数值、或文本,或单元格区域,或图片……

…………

刚才说集合是一个一维数组,那么为啥不直接让用户自建一个一维数组来存储信息,
而要开发集合对象方法这样一个东东呢?

呵呵,因为集合方法中的一维数组有以下特点,可以简化处理过程,节省用户写代码的时间,也不容易错。

特点-1
可以进行写入(.Add添加)、读取、删去(.Remove)操作,

其中,.Add添加 时,不需要地址,总是自动添加到集合数组中的最后一个位置。

如果是自定义数组,也可以做到,但可能会是这样子:
Sub test2()
    Dim arr()
    For i = 1 To 10
        ReDim Preserve arr(1 To i) '每次在需要向一维数组中添加新元素时,需要先扩大数组
        arr(i) = i '然后再添加新元素
    Next
End Sub

呵呵,虽然实际上集合方法中也是这么做的,但毕竟通过封装和后台运行,减少了用户的麻烦。

待续

TA的精华主题

TA的得分主题

发表于 2013-7-4 11:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-7-4 11:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习,学习。
谢谢群子的分享。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-4 12:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
接下来,读取集合中元素时,需要指定位置

……这个和普通数组并无差异(只有字典可以直接用关键词key定位置)

方法是: t = s(i)
或者正规一些的写法是:  t = s.Item(i)


……
然后,【比普通数组强】的地方终于出现了!
那就是: 直接删去/抹去已经不需要的某个特定位置的信息!

方法是Remove:
s.Remove (i)

删去一维数组中第 i 个信息,同时自动把数组大小缩减

对应的普通数组做法就会比较复杂:
Sub test3()
    ReDim arr(1 To 10)
    For i = 1 To 10
        arr(i) = i
    Next
    Rmv arr, 3
End Sub
Sub Rmv(arr, j)
    For i = j + 1 To UBound(arr)
        arr(i - 1) = arr(i)
    Next
    ReDim Preserve arr(1 To UBound(arr) - 1)
End Sub

呵呵,也许集合方法中也是这么做的……但毕竟封装、后台运行以后,用户就省心多了。



s.Remove (1)
s.Remove (s.Count)



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-7-4 12:12 | 显示全部楼层
能不能删除任意位置的元素?

点评

如果在Add集合元素的同时加入唯一的key值,以后就可以根据key值进行检索、删除了。详细见20楼代码例子。  发表于 2013-7-5 11:42

TA的精华主题

TA的得分主题

发表于 2013-7-4 12:14 | 显示全部楼层
学习了,的确挺有意思,不过只能处理一维数组,还是有点不太够用........
实际工作中大概多数用来进行辅助判断吧,例如遍历关键词之类的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-7-4 12:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
接下来,关于删除集合中需要元素的方法,
和字典方法比有个缺点。

字典方法有RemoveAll方法可以一下子全部删去,

而集合中只能一个一个来:
每次删去第一个的方法,
For i = 1 To s.Count
    s.Remove (1)
Next
   
或者每次删去最后一个的方法:
For i = 1 To s.Count
    s.Remove (s.Count)
Next
   
显然第一种方法,每次删去第一的做法更不容易错,也更简单

………………

不过说到最后,一次性删去全部信息还是有绝招的……

Set s = Nothing

这样就彻底清空了。呵呵。

还有一个做法就是:
Set s = New Collection

这样也可以的。


总结:
删去全部集合元素的方法有三种。

1. 重新初始化集合s
    Set s = New Collection
    处理结果,s为一个已经初始化了的没有任何元素的空集合变量

2. 变量s初始化
   Set s = Nothing
    处理结果,s为一个变量类型为集合对象的空集合变量

   其实1和2的执行效果是一样的,只是过程不一样。


3. 遍历集合逐个删除(每次删第1个,或删最后1个)


呵呵。

点评

1,2是最快的选择.而方法三中,每次删除第一个也比较快,而每次删除最后一个速度太慢,10万个元素都能使电脑假死.如果确定要删除所有元素的话,最好的选择是摧毁这个集合.  发表于 2014-9-24 17:24
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-22 00:59 , Processed in 0.043411 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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