数组(Array),简单地说就是将一组数据组合在一起成为一个整体,便于传递和统一处理;一般来讲,会将同一类型的一组数据放在同一个数组中。本文将介绍数组在VBA中的应用。
创建一个数组时需要使用Array()函数,其参数为数组元素(数组成员),多个元素使用逗号(,)分隔;访问数组元素数据时需要使用数组变量,并在其变量名后的一对圆括号中指定元素的索引。
需要注意的是,默认情况下数组元素的索引值是从0开始的,即第一个元素索引为0、第二个元素索引为1、以此类推,最后一个元素的索引为元素数量减1。虽然可以在代码文件的开始使用“Option Base 1”语句设置数组的索引从1开始,但一般会建议使用默认行为,特别是在团队开发过程中。
下面的代码演示了数组的定义和元素数据读写。
VBA |
Sub test() Dim arr arr = Array(1, 2, 3) Debug.Print (arr(0)) Debug.Print (arr(2)) ' arr(1) = 22 Debug.Print (arr(1)) End Sub |
执行代码会显示1、3、22。本例,首先定义了arr变量,然后通过Array()函数创建一个数组赋值给arr变量,数组元素有数值1、2、3;接下来显示了索引为0和2的值,也就是第一和第三个元素的数据;最后将索引1(即第二个元素)的值设置为22并显示。请注意,代码中声明arr变量时没有指定类型,数组元素的默认类型为Variant。
需要确定数组元素数量时,可以在数组变量后使用一对圆括号指定数组元素的最大索引或索引范围,如下面的代码。
VBA |
Sub test() Dim arr(2) arr(0) = 1 arr(1) = 2 arr(2) = 3 Debug.Print (arr(0)) End Sub |
本例,在声明数组变量arr时同时指定了数组的最大索引2,也就是说数组有3个元素,如果明确指定索引范围可以在括号使用To关键字,如下面的代码。
VBA |
Sub test() Dim arr(0 To 2) arr(0) = 1 arr(1) = 2 arr(2) = 3 Debug.Print (arr(0)) End Sub |
声明时没有指定元素数量的数组称为动态数组,动态数组可以在需要时扩展其元素,如下面的代码演示了如何使用ReDim Preserve语句扩展数组元素。
VBA |
Sub test() Dim arr arr = Array(1, 2, 3) ' 添加数组元素 ReDim Preserve arr(3) arr(3) = 4 ' Debug.Print (arr(3)) End Sub |
代码中,首先定义了包含1、2、3三个元素的数组,然后通过ReDim Preserve语句扩展了arr(3)元素,并赋值为4;最后,在立即窗口中显示此元素的值4。
使用ReDim语句修改数组的维度时应注意,如果没有使用Preserve关键字,则数组元素的数据会重置为默认值,如前面示例中的数组没有指定元素类型,其元素默认都会重置为空值(Empty)。
VBA |
Sub test() Dim arr arr = Array(1, 2, 3) ' 添加数组元素 ReDim arr(3) ' Debug.Print (arr(0)) End Sub |
执行代码,演示arr(0)元素的数据不是当初赋值的1,而重置为Variant类型的默认值——空值(Empty)。
声明数组变量时可以同时声明元素的数据类型,如下面的代码。
VBA |
Sub test() Dim arr(3) As Long Debug.Print (arr(0)) End Sub |
代码中没有对数组元素赋值,执行代码会显示第一个元素的默认值,因为在声明数组变量时指定了元素数据类型为Long,所以默认值为0。
实际应用中,如何声明数组变量和指定元素数据可以灵活掌握。需要注意的是,如果在Dim语句声明的数组变量已经指定了维度(静态数组),则不能使用ReDim语句重新定义数组的维度。
再来看一些数组的常用操作,如下面的代码。
VBA |
Sub test() Dim arr() As Long For i = 0 To 2 ReDim Preserve arr(i) arr(i) = i + 1 Next ' For Each e In arr Debug.Print (e) Next End Sub |
代码演示了如何使用For...Next和For Each...Next语句访问数组元素。首先定义了一个空数组,并声明元素的数据类型为Long;然后通过For循环添加了三个元素,数据分别是1、2、3;最后,通过For Each循环访问数组元素并显示在立即窗口。
如果已存在一个数组,还可以使用LBound()和UBound()函数分别获取数组的最小索引和最大索引,下面的代码显示了相关应用。
VBA |
Sub test() Dim arr(2) As Long For i = 0 To 2 arr(i) = i + 1 Next ' Dim min As Integer, max As Integer min = LBound(arr) max = UBound(arr) ' For i = min To max arr(i) = arr(i) ^ 2 Next ' For Each e In arr Debug.Print (e) Next End Sub |
执行代码会显示1、4、9。本例,首先定义了包含1、2、3的数组;然后通过LBound()和UBound()函数获取最小索引和最大索引,并通过For循环将每个元素的数据修改为原值的二次方;最后通过For Each循环显示元素的数据。
实际应用,For循环和For Each循环都可以访问数组的元素,但在使用时也要注意一些区别,如果只是读取元素的数据,则两种方法都可以实现;如果需要同时使用索引和数据,特别是要修改元素数据时,就应该在For循环中操作。
VBA代码中,还可以通过Excel函数操作数组的数据,如下面的代码。
VBA |
Sub test() Dim arr(2) As Long For i = 0 To 2 arr(i) = i + 1 Next ' Debug.Print (Application.min(arr)) Debug.Print (Application.Count(arr)) End Sub |
执行代码会显示1和3。本例,首先定义了包含1、2、3的数组;然后通过Application对象调用Excel内置函数,使用Min()函数获取了最小值1,使用Count()函数获取数组元素的数量3。
前面讨论的数组都是一维的,简单地说就是一个数据集合;而处理数据时有时需要多维数据结构,如二维矩阵;VBA中定义多维数组时需要在数据变量后的括号中使用逗号分隔,分别指定每个维度的最大索引值或索引范围,如下面的代码演示了一个3×2的数组结构。
VBA |
Sub test() Dim arr(2, 1) As Long For i = 0 To 2 For j = 0 To 1 arr(i, j) = (i + 1) * (j + 1) Next Next ' Debug.Print (arr(2, 1)) End Sub |
代码中,首先定义了arr数组,其第一维度最大索引为2,即有3个元素;第二维度最大索引为1,即有2个元素;执行代码会显示数组中的最后一个数据6。此外,本例生成数组可以想象为如下图所示的结构。

#图#二维数据结构