【20180914】- VBA中数组、集合和字典(四)——集合的常用方法和属性

大家好,我是中药党。上次我们一块学习了ExcelVBA中和数组相关的一些常用函数的用法,这次我们来介绍集合的常用方法和属性。

VBA中的集合是用户定制的一组数据信息,存放于一个特殊的一维数组中,但和数组不同的是,对集合中的数据类型,没有任何限制,也不需要数据类型相同,比如,数值、文本、工作表、工作簿等等都可以加入集合。但是有的小伙伴会问了,说集合是一个一维数组,那么为啥不直接建立一个一维数组来存储信息,而要使用集合对象呢?答案很简单,因为使用集合处理可以简化处理过程,节省代码量。比如,我们要向一个不定长度的一维数组中添加元素,代码如下图:

而如果我们要向集合中添加成员,代码就非常简单,如下图:

从上边的例子很容易看出,用集合来处理这种问题会非常方便,下边我们就详细介绍一下集合中几种方法的使用。1.Add方法和Item方法集合的Add方法用来添加一个成员到Collection对象,Item方法利用位置或键(key)返回Collection 对象的指定成员。Add语法:object.Add  item, key, before, after参数描述object必需的。代表一个集合对象。item必需的。指定要添加到集合中的成员,可以是任何数据类型。key可选参数。唯一字符串表达式,指定可以使用的键字符串,代替位置索引来访问集合中的成员。before可选参数。指定集合中的相对位置。在集合中将添加的成员放置在 before 参数识别的成员之前。如果为一数值表达式,则 before 必须是介于 1 和集合 Count 属性值之间的值。如果为一字符串表达式,则当添加一个被引用的成员到集合时,before 必须对应于指定的 key 值。可以指定 before 位置或 after 位置,但不能同时指定这两个位置。after参考同上边before的描述Item语法:object.Item(index)Index参数:指定集合中成员的位置。如果是数值表达式,则 index 必须是从 1 到集合Count 属性值之间的数值。如果是字符串表达式,则当加入一被引用的成员到集合时,index 必须和 key 参数对应。下边我们看几个使用方法添加集合成员的例子:①按顺序添加集合成员。得到的集合是索引从1开始的自然数,用Item(3)取得集合中第三个成员,如下图:

②按顺序添加集合成员,为集合成员设置字符索引(其实就是起个别名)。得到的集合不仅可以用数字索引取得,也可以用字符索引取得,如下图:

③使用before和after添加集合成员可以改变新添加成员的顺序。Before和after的参数可以设置为数值,也可以设置为已设置的字符索引(key),表示在现在集合相应索引位置的前边或者后边添加新成员。

④可选参数的设置方法。Add方法的参数有四个,除了第一个参数是必需参数,其余参数都是可选参数,当不设置中间可选参数,要设置后边的可选参数时,中间的可选参数要用逗号隔开,表示不设置这个位置的可选参数。如下图:

⑤Item是集合的默认缺省方法Item 方法是集合的缺省方法。因此,以下两行程序代码等价:

有的小伙伴提出这样的问题,如果我想替换集合中某个位置的元素,能不能给该位置的元素赋值呢?如下图:

在集合中,Item是集合的方法,并不是集合的属性,是无法通过等号赋值的。正确的做法是在Item(i)之前添加成员,原来的Item(i)就順移到Item(i+1),然后再将item(i+1)删掉,这样就达到了目的。如下图:

2.Remove方法集合的Remove方法就是把成员从Collection 对象中删除。语法:object.Remove indexIndex参数:必需的。表达式,指定集合成员的位置。如果是数值表达式,则 index 必须是介于 1 和集合Count 属性值之间的数。如果是字符串表达式,则为成员用Add方法添加到集合时,为成员设置的字符串索引key。①通过数字索引删除集合成员

移除掉原来集合中Item(1)位置的成员,原来Item(2)位置的成员就順移到Item(1)位置,如下图:

②也可以通过添加成员时设置的字符串索引移除集合成员。

3.Count属性集合的唯一一个属性,返回包含集合中的对象数目,类型是Long(长整数),只读。该属性取得一个集合的成员个数,最常用的场景是在循环遍历某个集合中使用,如下图:

集合在平常的使用是非常的多,但是使用起来却是比较简单,只有三个方法(Add、Item和Remove)和一个属性(Count),即使是参数较多的Add方法,在平常的大部分使用场景中,也很少用到后边几个可选参数。小伙伴们在操作数量不定的多工作簿、多工作表或者多个Range区域的时候,很大程度都会要用到集合,所以,在遇到类似问题时,尽量用集合操作而非一维动态数组。今天就说到这里,欢迎小伙伴们提出问题、多多交流。猜您喜欢

(0)

相关推荐