3.3 数组
数组是由一组具有相同名称的同类元素组成的。它是一个归集了同类元素的集合。数组中的每个成员其数据类型都是相同的。
3.3.1 数组简介
数组实际上也是变量,只是声明数组的时候并不是声明一个变量,而是一次性地声明了若干个变量。这些变量在内存中占用了一片连续区域,具有相同的名称和数据类型。数组的声明方法和变量的声明方法是相同的。如果数组不随着程序的运行而改变其大小,那么声明这样的数组时将会包括两个方面的内容。
● 数组的数据类型。
● 指定数组的上界与下界。
1. 数组上界与下界
数组的上界和下界指明了数组每个维度最多可以容纳的元素数。对于一维数组而言就是要指明其一共有多少个元素,对于二维及以上维度的数组来说,就是要指明其每个维度最多可以容纳的成员数。
例如“Dim yue(11) As Integer”就表示一个包含了12个元素的数组。在该数组中元素的标号是从0开始到11为止。0就是该数组的下界,11就是数组的上界。
说明
默认的情况数组的下界是从0开始计数。
数组下界从0开始很多时候不符合用户的使用习惯,通过下述的方法可以自行定义数组的上界和下界。
● 在数组声明的时候直接指明该数组的下界和上界,如“Dim yue(1 To 12) As Integer”来表示数组的计数是从1开始,到12为止。
● 可以在模块的任意过程之前输入代码“Option Base 1”,使得数组下界总是从1开始。
2. 多维数组
数组可以不止一个维度。不同的维度之间使用逗号隔开。多维数组的声明方式如下所示:
Dim数组名(第1维度下界和上界,第2维度下界和上界……) As数据类型
例如代码“Dim myArr(1 To 10, 1 To 10) As Integer”就声明了一个名称为myArr的数组。
在Excel VBA中最常用的多维数组就是二维数组,二维数组在空间上对应的就是一个单元格区域。该数组实际上构成了一个10行10列的表格。如果将二维数组对应到表格内,那么数组括号内,第1个维度表示的是行,第2个维度表示的是列。在Excel中单元格区域和数组是可以互相转化的。
例3-11:假设在工作表中存在一个如图3-6所示的单元格区域,
图3-6 各地区销售额
将A1到C4单元格区域转化为一个数组,并在调试窗口中显示数组第1个元素的值。
#001: Sub单元格区域转化为数组() #002: Dim f As Variant #003: f = ActiveSheet.Range("a1:c4") #004: Debug.Print f(1, 1) #005: End Sub
第2行代码将变量f声明为Variant类型。值得注意的是在单元格区域转化为数组的过程中,声明变量只能采用这样的方式。此时f就表示数组名,声明该数组的时候无需指定维度的多少以及各个维度的上界和下界。第3行代码将指定的单元格区域赋值给了数组。“ActiveSheet.Range("a1:c4")”表示活动工作表的A1到C4单元格区域。按键盘上的Ctrl+G组合键,那么可以在立即窗口中显示第一个元素的值。运行的结果如图3-7所示。
图3-7 运行结果
注意
当将单元格区域转化为一个二维数组的时候,二维数组的各个维度其下界是从1开始计数,而不是0,因此在数组f中不存在f(0,0)这个元素。
3.3.2 动态数组
在实际应用过程中,用户在声明数组的时候并不一定知道数组的各个维度上其上界的确切数值。很多时候,数组会随着程序的运行而慢慢变大。此时可以将数组声明为一个动态的数组。
动态数组的声明方式为:
Dim数组名() As数据类型
例如“Dim myArr() As Integer”的代码来声明一个名为myArr的数组,该数组并没有指明各个维度的上界和下界,其含义仅仅表示在今后的代码中会应用到一个名为myArr的数组。
和声明变量一样,变量到使用的时候一定要有一个确定的值。当要使用定义的动态数组myArr时,就不必确定这个数组的大小。此时就需要使用ReDim关键字对数组进行重新定义。以myArr为例,使用ReDim的时候有两种方式。
● 第一种方式:ReDim myArr(10)
● 第二种方式:ReDim Preserve myArr(20)
在第一种方式中,“ReDim myArr(10)”就明确了重新定义了数组myArr的大小其上界为10共11个元素。用户此时可以对这11个元素进行赋值。
在使用动态数组的时候,通常要对一个数组的大小多次进行重新定义,此时,当数组再次被ReDim重新定义大小时候,数组中原先保存的值就会被清除,如果要保留原先数组的值,需要使用“ReDim Preserve”来声明。这就是第二种方式中所提到的用法。
例如在第1次使用ReDim并对数组各元素赋值完成后,还可以继续定义myArr数组的大小,此时如果直接再次使用ReDim声明数组myArr,那么将不再保存上次定义的11个元素的值。如果想保存原先的11个元素的值,就需要在ReDim后使用Preserve。可以用一个实例来了解动态数组的使用方法。
例3-12:在代码中声明一个名为myArr的动态数组,然后使用ReDim声明其具有一个元素。其值为“一车间”。再次利用ReDim声明myArr数组的大小,声明该数组具有三个元素,第一个元素的值为原来数组中第一个元素的值;并且第二个元素的值为“二车间”;第三个元素的值为“三车间”。通过代码了解动态数组的使用方法。
#001: Sub动态数组演示() #002: Dim myArr() As String #003: ReDim myArr(0) #004: myArr(0) = "一车间" #005: ReDim Preserve myArr(2) #006: myArr(1) = "二车间" #007: myArr(2) = "三车间" #008: Debug.Print myArr(0), myArr(2) #009: End Sub
第2行代码声明了一个名为myArr的数组,第3行代码定义了这个数组的大小,该数组只有一个元素。第4行代码表示该元素的值为“一车间”。第5行代码再次声明了myArr数组的大小,使用“ReDim Preserve”声明表示第2次声明的数组将保留上次数组中的值,第6行和第7行代码对myArr数组中的其他两个成员进行赋值。第8行代码将运行的结果显示在立即窗口中。
打开立即窗口,单击工具栏上的运行按钮,最终的运行结果如图3-8所示。
图3-8 显示动态数组的值
注意
“Debug.Print myArr(0), myArr(2)”表示将数组中第1个值和第3个值都现在窗口,“myArr(0), myArr(2)”之间的逗号表示要将两个值显示在同一行中。