前面我们讲过用户定义数据类型 UDT,从今天开始讨论数组。数组类型(array type)是一种由多个相同数据类型的元素组成的新类型,组成数组的元素类型(element type)可以是各种 VBA 的基本类型。组成数组的每一个元素都有一个唯一的索引(index),也就是说,数组是由一组顺序索引元素(sequentially indexed elements)组成的。- 数组的每个元素都有一个唯一的索引,这个索引就是元素在数组中的相对位置
- 数组元素的索引是顺序的,也就是说,以第 1 个元素的索引 i1 作为基点:
- 第 n 个元素的索引 i(n) = i(n-1) + 1
- 由此,一个数组的所有元素的索引组成了一个连续的整数区间 [ i1, ..., i(n) ]。
Dim MyArray(9) As IntegerDim i As IntegerFor i = 0 To 9 MyArray(i) = iNext i
以上代码声明 MyArray 是一个数组类型,含有 10 个元素,其元素类型是 Integer。也就是说,MyArray 是一个包含 10 个整数的数组。注意:这里我们说 MyArray(9) 是一个含有 10 个元素的数组类型,是因为 VBA 默认数组的下界(即第一个元素的索引)是 0,而 MyArray(9) 中的 9 是数组的上界,因此,MyArray 的元素索引从 0 开始,一直到 9,共有 10 个元素。VBA 默认数组的下界是 0,这个默认值是可以改的,由 Option Base 控制:VBA 的默认设置是 Option Base 0,你如果需要 VBA 的数组下界是 1 的话,就使用 Option Base 1 来设置,如下:Option Base 1 ' 在文件的起始位置设置...Dim MyArray(10) As IntegerDim i As IntegerFor i = 1 To 10 MyArray(i) = iNext i
与 VBA 的其他 Option 设置一样,Option Base 也需要位于文件的起始位置。如上设置之后,需要要声明 MyArray 是一个含有 10 个 Integer 类型元素的数组类型,则必须声明为 MyArray(10)。这时元素的索引是从 1 到 10。其中的 For ... Next 循环是对 MyArray 的元素赋值。从这里可以看出,数组的赋值是对数组元素分别赋值。因为数组元素虽然都是同一类型,但可以有不同的值,因此要分别对元素赋值,而且改变某个元素的值并不影响其他元素的值。Dim Names(30) As StringDim i As IntegerFor i = LBound(Names) To UBound(Names) Names(i) = "Hello " + CStr(i)Next i
在这个例子中,字符串数组 Names 到底含有多少个元素,由 Option Base 的设置决定。如果没有设定,则 Names 的元素索引从 0 开始,因此 Names 含有 31 个元素。如果使用了 Option Base 1 设定,则 Names 的元素索引从 1 开始,因此 Names 含有 30 个元素。如果不能肯定数组的下界和上界,则使用 LBound 和 UBound 两个函数来获取数组的下界和上界:- LBound(Names):返回数组 Names 的下界
- UBound(Names):返回数组 Names 的上界
知道了数组的下界和上界,就可以计算出数组的元素个数:n = UBound(Names) - LBound(Names) + 1
数组的元素个数 n 可以由 UBound 和 LBound 函数计算出来,而不管数组的下界和上界到底是多少。数组的下界除了由 Option Base 控制之外,还可以在数组声明时指定,从而不受 Option Base 设置的影响。Dim MyArray(3 to 5) As IntegerDim i As IntegerFor i = LBound(MyArray) To UBound(MyArray) MyArray(i) = i * iNext i
在这个声明中,MyArray(3 to 5) 表示:数组 MyArray 的下界是 3,上界是 5。从而数组 MyArray 的元素索引为: 3, 4, 5。这个声明不受 Option Base 设置的影响,也就是说,不管 Option Base 如何设置,MyArray 的下界总是 3,上界总是 5。从这个例子再一次看出,使用 LBound 和 UBound 指定数组的界限,比使用具体的数值,要方便得多。注意:上面我们多次称呼数组的下界和上界,严格说来,是指数组元素索引的下界和上界。因为数组元素的索引是一个区间,因此存在着下界和上界,也就是数组元素索引从哪个值(下界)开始(标志着数组的第一个元素),到哪个值(上界)结束(标志着数组的最后一个元素)。