VBA二维数组的基础介绍
既然你已经知道了如何有规划地产生一个清单(一维数组),是时候仔细看一下如何使用数据表了。下面的过程产生一个二维数组,储存国家名称,货币名称和交换汇率。
Sub Exchange()
Dim t As String
Dim r As String
Dim Ex(3, 3) As Variant
t = Chr(9) 'tab
r = Chr(13) 'Enter
Ex(1, 1) = "Japan"
Ex(1, 2) = "Yen"
Ex(1, 3) = 128.2
Ex(2, 1) = "Mexico"
Ex(2, 2) = "Peso"
Ex(2, 3) = 9.423
Ex(3, 1) = "Canada"
Ex(3, 2) = "Dollar"
Ex(3, 3) = 1.567
MsgBox "Country " & t & t & "Currency" & t & "per US$" _
& r & r _
& Ex(1, 1) & t & t & Ex(1, 2) & t & Ex(1, 3) & r _
& Ex(2, 1) & t & t & Ex(2, 2) & t & Ex(2, 3) & r _
& Ex(3, 1) & t & t & Ex(3, 2) & t & Ex(3, 3), , _
"Exchange"
End Sub
当你运行过程Exchange时,你将看到一个信息框,显示三列信息(见图7-2)
图7-2 显示在信息框上的文本是可以自定义格式的。
数组的维数:
Sub 数组示例():
Dim x As Long, y As Long
Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行3列的数组空间
For x = 1 To 4
For y = 1 To 3
arr(x, y) = Cells(x, y) '通过循环把单元格区域a1:c4的数据装进数组中
Next y
Next x
MsgBox arr(4, 3) '根据提供的行数和列数显示数组
arr(1, 2) = "我改一下试试"'你可以随时修改数组内指定位置的数据
MsgBox arr(1, 2)
End Sub
Dim x As Long, y As Long
Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行3列的数组空间
For x = 1 To 4
For y = 1 To 3
arr(x, y) = Cells(x, y) '通过循环把单元格区域a1:c4的数据装进数组中
Next y
Next x
MsgBox arr(4, 3) '根据提供的行数和列数显示数组
arr(1, 2) = "我改一下试试"'你可以随时修改数组内指定位置的数据
MsgBox arr(1, 2)
End Sub
总结:二维是由行和列表示的数组,如 ARR(3,2)表示数组中第3排第2列的元素。而一维数组只是由一个元素决定,如ARR(4)表示数组中第4个元素
静态和动态数组
到目前为止,本章介绍的都是静态数组。静态数组是具有确定大小的数组。当你事先知道数组的大小时使用静态数组。静态数组的大小是在数组的声明语句里确定的,例如,语句 DimFruits(10)AsString 声明了一个由10个成员组成的叫做 Fruits 的静态数组。
但是,万一你不肯定你的数组会包含多少个成员呢?如果你的过程由用户输入决定,每次程序执行时,用户提供的成员数可能会变化的。你如果确保你声明的数组不会浪费内存呢?
回想你声明了一个数组后,VBA 会留出足够的内存来储存数组。如果你声明一个比你需要的更多成员的数组的话,你将浪费计算机资源。这个问题的解决方法是让你的数组变为动态的。动态数组是大小可以改变的数组。如果数组的大小每次都由程序运行而决定的话,就使用动态数组。
1. 在当前工程里插入一个新模块并且重新命名为 DynamicArrays
2. 输入下列过程 DynArray:
2. 输入下列过程 DynArray:
Sub DynArray( ) Dim counter As Integer 'declare a dynamic array Dim myArray( ) As Integer 'specify the initial size of the array Redim myArray(5) Workbooks.Add 'populate myArray with values For counter = 1 to 5 myArray(counter) = counter +1 ActiveCell.Offset(counter-1, 0).Value = myArray(counter) Next 'change the size of myArray to hold 10 elements Redim Preserve myArray(10) 'add new values to myArray For counter = 6 To 10 myArray(counter) = counter * counter With ActiveCell.Offset(counter-1, 0) .Value = myArray(counter) .Font.Bold = True
End with Next counter
End Sub
3. 将你的 Excel 窗口和 VB 编辑器窗口并排显示
4. 逐步运行过程 DynArray。你可以将鼠标置于代码中间,并且按下F8来执行逐条语句。程序
DynArray 的结果如下图所示。
4. 逐步运行过程 DynArray。你可以将鼠标置于代码中间,并且按下F8来执行逐条语句。程序
DynArray 的结果如下图所示。
图7-3 显示10个数据的数组
在过程 DynArray 里,Dim myArray() As Integer 语句声明了一个叫做 myArray 的动态数组。尽管该语句声明了数组,但是,没有分配任何内存给该数组。第一条 ReDim 语句明确了 myArray 的开始大小并且占据了10个字节的内存让它储存5个成员,正如你所知,每个整型数据需要两个字节的内存。
语句 Workbooks.Add 打开一新工作簿,然后 For…Next 循环用数据填充数组 myArray 并且将数组的成员写入工作表。在循环开始之前,变量 counter 等于1。循环里的第一条语句:
myArray(counter) = counter + 1
分配数值2给 myArray 的第一个成员。第二条语句:ActiveCell.Offset(counter-1, 0).Value = myArray(counter)
将 myArray 成员的值输入到当前单元格里。当前单元格为A1。因为变量 counter 等于1,所以上面的语句就等于:ActiveCell.Offset(1-1, 0).Value = myArray(1)
或者ActiveCell.Offset(0,0).Value = myArray(1)
上面的语句在单元格A1里输入数据。循环里面的语句被执行5次。VB在合适的工作表单元格里马输入数据并且进行到下一语句:ReDim Preserve myArray(10)
通常,当你改变一个数组的大小时,你将失去该数组原来的所有数据。语句 ReDim 将数组重新初始化。然而,你可以将新成员加入到现存的数组里去,通过在语句 ReDim 后面带上关键字 Preserve。换句话说,关键字 Preserve 保证重新改变大小的数组不会弄丢现有的数据。如果你忽略它,新数组将会是空的。
第二个 For…Next 循环给数组 myArray 的第六,第七,第八,第九和第十个成员赋值。这次,数组成员的数值是相乘的:counter * counter。VB使用粗体将数组其它的数值输入到合适的工作表的单元格里面。
技巧:确定数组大小
在使用数组之前,必须在 Dim 或 ReDim 语句里确定数组的大小。这意味着你不可以给数组成员赋值,直到你使用 Dim 或者 ReDim 语句声明了该数组。