VBA基础语法:数组

雨燕双飞 提交于 2020-01-10 20:59:18

声明数组

数组的声明方式和其它的变量是一样的,它可以使用 DimStaticPrivate Public 语句来声明。标量变量(非数组)与数组变量的不同在于通常必须指定数组的大小。若数组的大小被指定的话,则它是个固定大小数组。若程序运行时数组的大小可以被改变,则它是个动态数组。

数组是否从 0 或 1 索引是根据 Option Base 语句的设置。如果 Option Base 没有指定为 1,则数组索引从零开始。

声明固定大小的数组

下面这行代码声明了一个固定大小的数组,它是个 11 行乘以 11 列的 Integer 数组:

Dim MyArray(10, 10) As Integer

第一个参数代表的是行;而第二个参数代表的是列。

与其它变量的声明一样,除非指定一个数据类型给数组,否则声明数组中元素的数据类型为 Variant。数组中每个数组的数字型 Variant 元素占用 16 个字节。每个字符串型 Variant 元素占用 22 个字节。为了尽可能使写的代码简洁明了,则要明确声明的数组为某一种数据类型而非 Variant。下面的这几行代码比较了几个不同数组的大小:

' 整型数组使用 22 个字节(11 元素* 2 字节)
ReDim MyIntegerArray(10) As Integer

' 双精度数组使用 88 个字节(11 元素 * 8 字节)。
ReDim MyDoubleArray(10) As Double

' 变体型数组至少使用 176 字节(11 元素 * 16 字节)。
ReDim MyVariantArray(10)

' 整型数组使用 100 * 100 * 2 字节(20,000 字节)。
ReDim MyIntegerArray (99, 99) As Integer 

' 双精度数组使用 100 * 100 * 8 字节(80,000 字节)。
ReDim MyDoubleArray (99, 99) As Double 

' 变体型数组至少使用 160,000 字节(100 * 100 * 16 字节)。
ReDim MyVariantArray(99, 99)

数组变量的最大值,是以的操作系统与有多少可用内存为基础。若使用的数组大小超过了系统中可用内存总数的话,则速度会变慢,因为必须从磁盘中读写回数据。

声明动态数组

若声明为动态数组,则可以在执行代码时去改变数组大小。可以利用 StaticDimPrivate Public 语句来声明数组,并使括号内为为空,如下示例所示。

Dim sngArray() As Single

注意 可以在过程中使用 ReDim 语句来做隐含性的数组声明。当使用 ReDim 语句时要小心点,不要拼错数组的名称。否则即使在模块中有包含 Option Explicit 语句,仍然会因此而生成第二个数组。

对于过程中的数组范围,可以使用 ReDim 语句去改变它的维数,去定义元素的数目以及每个维数的底层绑定。每当需要时,可以使用 ReDim 语句去更改动态数组。然而当做这个动作时,数组中存在的值会丢失。若要保存数组中原先的值,则可以使用 ReDim Preserve 语句来扩充数组。例如,下列的语句将 varArray 数组扩充了10 个元素,而原本数组中的当前值并没有消失掉。

ReDim Preserve varArray(UBound(varArray) + 10)

注意 当对动态数组使用 Preserve 关键字时,只可以改变最后维数的上层绑定,而不能改变维数的数目。

使用数组

可以声明一个数组来代表一群具有相同数据类型的值。数组是单一类型的变量,它具有很多的隔室来存储很多值,而常规的变量只有一个存储隔室,所以只能存储一个值。但要引用所保持的所有值时,可以引用整个数组或是只引用数组的个别元素。

例如,若要存储一年中每天的支出,可以声明一个具有 365 个元素的数组变量,而不是 365 个变量。数组中的每一个元素都包含一个值。下列的语句声明数组变量 curExpense 具有 365 个元素。按照缺省规定,数组的索引是从零开始,所以此数组的上标界是 364 而不是 365。

Dim curExpense(364) As Currency

若要设置个别元素的值,必须指定元素的索引。下面的示例对于数组中的每个元素都赋予一个初始值 20。 

Sub FillArray()
    Dim curExpense(364) As Currency
    Dim intI As Integer
    For intI = 0 to 364
        curExpense(intI) = 20
    Next
End Sub

更改数组的底层绑定

可以在模块的顶部使用 Option Base 语句,将第一个元素的缺省索引值从 0 改成 1。在下面的示例中,Option Base 语句改变数组第一个组件的索引值,接着 Dim 语句声明数组变量 curExpense 具有 365 个元素。

Option Base 1
Dim curExpense(365) As Currency

也可以利用 To 子句来对数组的底层绑定做显示地声明,如下面的示例所示:

Dim curExpense(1 To 365) As Currency
Dim strWeekday(7 To 13) As String

在数组中存储 Variant 值

有两种方式可以创建 Variant 值的数组。第一种方式是声明 Variant 数据类型的数组,如下面的示例所示:

Dim varData(3) As Variant
varData(0) = "Claudia Bendel"
varData(1) = "4242 Maple Blvd"
varData(2) = 38
varData(3) = Format("06-09-1952", "General Date")

另一种方式是指定 Array 函数所返回的数组为一个 Variant 变量,如下示例所示。

Dim varData As Variant
varData = Array("Ron Bendel", "4242 Maple Blvd", 38, _
Format("06-09-1952", "General Date"))

对于元素类型为 Variant 的数组,可以利用索引来识别各元素,而不管用何种方式创建此数组。例如,下列的语句可以被加到上述的示例中。

MsgBox "Data for " & varData(0) & " has been recorded."

使用具有多重维数的数组

在 Visual Basic 中最多可以声明变量到 60 个维数。例如,下列的语句声明一个 5 乘 10 的两维数组。

Dim sngMulti(1 To 5, 1 To 10) As Single

如果将数组想成矩阵,则第一个参数代表行,而第二个参数代表列。

可以使用嵌套的 For...Next 语句去处理多重维数数组。下列的过程将一个两维数组的所有元素都填入 Single 值。

Sub FillArrayMulti()
    Dim intI As Integer, intJ As Integer
    Dim sngMulti(1 To 5, 1 To 10) As Single

    ' 用值填入数组。
    For intI = 1 To 5
        For intJ = 1 To 10
            sngMulti(intI, intJ) = intI * intJ
            Debug.Print sngMulti(intI, intJ)
        Next intJ
    Next intI
End Sub

 source:VBA Help

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!