codecamp

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

总结:二维是由行和列表示的数组,如 ARR(3,2)表示数组中第3排第2列的元素。而一维数组只是由一个元素决定,如ARR(4)表示数组中第4个元素

静态和动态数组

到目前为止,本章介绍的都是静态数组。静态数组是具有确定大小的数组。当你事先知道数组的大小时使用静态数组。静态数组的大小是在数组的声明语句里确定的,例如,语句 DimFruits(10)AsString 声明了一个由10个成员组成的叫做 Fruits 的静态数组。

但是,万一你不肯定你的数组会包含多少个成员呢?如果你的过程由用户输入决定,每次程序执行时,用户提供的成员数可能会变化的。你如果确保你声明的数组不会浪费内存呢?

回想你声明了一个数组后,VBA 会留出足够的内存来储存数组。如果你声明一个比你需要的更多成员的数组的话,你将浪费计算机资源。这个问题的解决方法是让你的数组变为动态的。动态数组是大小可以改变的数组。如果数组的大小每次都由程序运行而决定的话,就使用动态数组。

1.  在当前工程里插入一个新模块并且重新命名为 DynamicArrays
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 = TrueEnd with
Next counter
End Sub
3.  将你的 Excel 窗口和 VB 编辑器窗口并排显示
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 语句声明了该数组。


VBA数组和循环语句
VBA的5个内置数组函数
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }