VBA研究数组的定义和使用

Posted 宋哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA研究数组的定义和使用相关的知识,希望对你有一定的参考价值。

作者:iamlaosong

数组用起来很方便,尤其是利用循环可以大大简化代码量。用数组读取工作表内容,再进行各种处理,可以大大提高程序效率。在数组使用过程中不可避免的要碰到一些令人困惑的问题,下面就讨论一下与数组相关的问题。

1、数组的上界和下界

定义(声明)数组时是要明确数组上界的,如下面语句:

Dim mm(31), ww(7, 2)

上面两个数组,mm的上界就是31,ww是个二维数组,上界分别是7和2,那么下界呢?

VBA默认将数组的第一个成员设置为0 (下标) ,因此,数字1代表数组中的第二个成员,而数字2则代表第三个,等等。因为数字编号起始于0 ,所以一维数组mm(31)包含从0到31共有32个成员。同样,二维数组ww(7, 2)共有8*3=24个成员。

如果希望从1开始计数数组里的成员,那么可以使用Option Base 1语句来强制指定该数组的下界。该指令必须置于VBA模块任何Sub语句上面的声明部分。如果不明确Option Base 1 ,那么VBA在使用数组是就会假定使用Option Base 0来从0开始编号数组成员。

当然,你可以不管上面的Option Base语句,直接在定义中明确下界和上界,即:

Dim mm(1 to 31), ww(1 to 7, 1 to 2)

上面定义方法也可以让数组从其他数字开始编号,负数也是可以的,但下界一定要小于或者等于上界,否则,数组是不能使用的(定义没问题但不能用)。例如:

Dim ma(11 to 20), wa(5 to 7, 2), wb(-5 to 7, 2)

如果没有指明下界,则按照Option Base语句指定的值定义。

UBound()函数可以返回指定的数组维可用的最大下标(上界)。例如:

UBound(ma)=20

UBound(wa, 1)=7

UBound(wa, 2)=2

UBound 函数用法
返回一个 Long 型数据,其值为指定的数组维可用的最大上界。

UBound(arrayname[, dimension]) 
UBound 函数的语法包含下面部分:
 
arrayname   必需的。数组变量的名称,遵循标准变量命名约定。
dimension   可选的;Variant (Long)。指定返回哪一维的上界。1 表示第一维,2 表示第二维,如此等等。如果省略 dimension,就认为是 1。

对应地,LBound() 函数,返回一个 Long 型数据,其值为数组指定维可用的最小下界。用法同上。

说明:
UBound 函数与 LBound 函数一起使用,用来确定一个数组的大小。

2、重新定义数组

固定长度的数组无法满足需求时,就需要改变数组长度,即根据需要用ReDim语句重新定义数组,改变数组长度。例如:

ReDim Arr(0 to 20)

ReDim是重新定义数组的意思,就是说把数组Arr重新定义成最小下标为0,最大下标为20的数组。

注意:这样定义之后的数组,内容都将会清空,以前保存到数组里的内容将没有了。

如果我们不想把数组内容清空怎么办?

用下面的定义方式:

ReDim Preserve Arr(0 to 20)

这个定义将不改变原有数组的内容,只改变数组长度。

注意:ReDim只能改变Dim没有声明维度的数组,否则会报“数组维数已定义”的错误。第一次执行ReDim时可以随便定义维度和上下界,第二次重定义时,只能改变最后一个维度的长度。

正确的使用方法如下:

    Dim Arr1(), Arr2()
    ...
    ReDim Arr1(30), Arr2(30,2)
    For i = 1 To 30
        Arr1(i) = i
        Arr2(i,1) = i
        Arr2(i,2) = "OK"
    Next i
    ReDim Preserve Arr1(40), Arr2(30,5)

总结一下:

(1)前提一定要声明一个数组,不需要赋值或者标明维数,例如dim Arr() as integer
(2)用ReDim重新定义一个数组,数组里数据全部清空,要保留原有数据加上Preserve
(3)ReDim只能修改数组最后一个维度,只能改变大小,不能改变类型

3、隐含的数组重新定义

用数组读取工作表内容时,实际就隐含着数组的重新定义。例如:

    Dim arrData1(), arrData2(), pmDir, pmName, pmRow1, pmCol1, pmCol2
    Dim MaxRow1 As Long, MaxRow2 As Long

。。。

        For k = 1 To FileNo
            Workbooks.Open Filename:=ThisWorkbook.Path & "\\" & pmDir & "\\" & arrFile(k)         
            MaxRow1 = Range("D1").End(xlDown).Row       '行数(数据从第2行开始)
            If MaxRow1 >= 2 Then
                arrData1 = Range(Cells(1, pmCol1), Cells(MaxRow2, pmCol1)..Offset(0, 2)).Value
            End If
            ActiveWindow.Close
        Next k

。。。
这儿循环一次,读取一次,每次数组的大小是不同的。

以上是关于VBA研究数组的定义和使用的主要内容,如果未能解决你的问题,请参考以下文章

VBA研究数组的定义和使用

了解上界和下界?在 Java 泛型中

上界下界和准确界

scala-协变逆变上界下界

scala-协变逆变上界下界

VBA编程08.数组