阅读(2296) (2)

VBA数组详解

2016-11-23 11:44:11 更新

声明数组

因为数组也是变量,所以,你必须用声明其它变量的类似方法声明数组——使用Dim语句。当你声明一个数组时,你便设定了该数组储存数据所需要的内存空间。
我们来看看一个数组声明的例子:
Dim cities(6) As String
Dim daysOfWeek(7) As String
Dim lotto(6) As Integer
Dim exchange(5, 3) As Variant
注意,变量名称后面带有括号以及括号里有数字。一维数组要求括号里带一个数字,这个数字决定了这个数组能够储存的最大成员数。二维数组后面总是带有两个数字——第一个数字是行索引号,而第二个数字是列索引号。在上面的例子里,数组exchange最多可以储存15个数据(5*3=15)。

数组声明的最后一部份是定义数组将要储存数据的数据类型。数组可以储存下列任何一种数据类型:Integer, Long, Single, Double, Variant, Currency, String, Boolean, Byte, or Date。

当你声明了一个数组,VB会自动占据足够的内存空间,分配的内存空间取决于该数组的大小和数据类型。当你声明一个名叫lotto的带有6个成员的一维数组时,VB将留出12个字节——数组的每个成员各占2个字节(回想整型数据类型为2个字节,因此2*6=12)。数组越大,储存数据需要的内存空间就越大。因为数组会吃掉很多内存,并因此影响你电脑的运行,因此,建议你仅仅根据你可能使用的成员数来声明数组。

数组的上界和下界

VBA默认将数组的第一个成员设置为0(索引号),因此,数字1代表数组中的第二个成员,而数字2则代表第三个,等等。因为数字编号起始于0,所以,一维数组cities(6)包含从0到6的七个成员。如果你宁愿从1开始计数你数组里的成员,那么你可以使用Option Base 1语句来强制指定该数组的下界。该指令必须置于VBA模块任何Sub语句上面的声明部分。如果你不明确Option Base 1,那么VBA在使用数组是就会假定使用Option Base 0来从0开始编号你的数组成员。

你也可以让数组从除0或1之外的数字开始编号,要达到该目的,你在声明数组变量时就必须明确该数组的边界。数组的边界是指它最小和最大的索引号。我们来看看下面的例子:
Dim cities(3 To 6) As Integer
上面的语句声明了一个带有四个成员的一维数组。数组名称后面括号里的数字明确了数组的下界(3)和上界(6)。该数组的第一个成员编号为3,第二个为4,第三个为5,以及第四个为6。注意下界和上界之间的关键字To。

技巧:数组范围
Dim语句明确的数组的下标区间就称为数组的范围,例如:Dim mktgCodes(5 To 15)

在VBA过程里使用数组

你声明了数组后,就必须给该数组的每个成员赋值,这也经常成为“填充数组”。我们来尝试使用一维数组有规划地显示六个美国城市的清单:

1.  打开一个新工作簿,并保存为Chap07.xls
2.  切换到VB编辑器窗口,并重新命名VBA工程为Tables
3.插入一新模块,重新命名为StaticArrays
4.输入下列过程FavoriteCities:
' start indexing array elements at 1 从1开始给数组成员编号
Option Base 1
Sub FavoriteCities()
'now declare the array
Dim cities(6) As String
'assign the values to array elements
cities(1) = "Baltimore"
cities(2) = "Atlanta"
cities(3) = "Boston"
cities(4) = "Washington"
cities(5) = "New York"
cities(6) = "Trenton"
'display the list of cities
MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
& cities(3) & Chr(13) & cities(4) & Chr(13) _
& cities (5) & Chr(13) & cities(6)
End Sub
在FavoriteCities过程开始之前,缺省的索引编号方式改变了,注意,Option Base 1语句是位于模块窗口Sub语句之上的。该语句告诉VB给数组的第一个成员赋值数字1,而不是缺省的0。

数组cities()声明为带六个成员的字符串类型变量。然后,给数组的每个成员都赋上了值。最后的语句使用Msgbox函数显示城市清单。当你运行该过程时,城市名称将会出现在分开的行上(参见图7-1)。你可以改变显示数据的顺序,改变索引号。

Msgbox
图7-1 你可以用Msgbox函数来显示一维数组的成员

5.  运行FavoriteCities过程并且检查结果
6.  修改FavoriteCities过程,让它逆序显示城市名称(从6到1)

技巧: 数组成员的初始值
在给数组成员赋值之前,该成员具有缺省值。数字变量的缺省值为0,而字符串变量的缺省值为空字符串。