Sub test()
' Dim s As Collection '定义s变量为集合对象
' Set s = New Collection '初始化集合对象s (否则无法使用)
Dim s As New Collection '推荐这句代码,直接初始化,可以不用再Set了
'集合s中添加元素的方法
For i = 1 To 10
s.Add i '对于集合s,用Add方法可以加入集合元素
'当然事实上你可以添加任意内容来代替本例中的i
Next
'读取集合中元素的方法
For i = 1 To s.Count '可以用Count属性返回集合中元素总个数
t = s(i) '读取集合s中第i个变量存入临时变量t中
t = s.Item(i) '正规的代码写法应该是这样子(效果一样,推荐用上一句更简明)
Debug.Print s(i) '在立即窗口中观察s(i)的值
Next
'下面是集合s中元素删除的方法
For i = 1 To s.Count '遍历集合元素
s.Remove (1) '每次删去第1个……直至全部删除完毕 或直接简写为: s.Remove 1
' s.Remove (s.Count) '或者每次删除最后一个,直至全部删除完毕(推荐用上一句,不容易错)
' 或简写为 s.Remove s.Count
Debug.Print s.Count '在立即窗口中观察集合s中剩余元素个数
Next
End Sub
集合是什么?
集合是用户定制的一组数据信息,存放于一个一维数组中,以便用户随时访问、增添、删除同类信息。
这个集合的定义,完全是由用户做主,对集合中的数据类型,没有任何限制……
完全取决于用户是否愿意根据某些自己确定的规则把符合要求的信息内容加入集合。
即,集合中元素可以是各种类型的数值、或文本,或单元格区域,或图片……
…………
刚才说集合是一个一维数组,那么为啥不直接让用户自建一个一维数组来存储信息,
而要开发集合对象方法这样一个东东呢?
呵呵,因为集合方法中的一维数组有以下特点,可以简化处理过程,节省用户写代码的时间,也不容易错。
特点-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
读取集合中元素时,需要指定位置
……这个和普通数组并无差异(只有字典可以直接用关键词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)
关于删除集合中需要元素的方法,
和字典方法比有个缺点。
字典方法有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个)