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只能修改数组最后一个维度,只能改变大小,不能改变类型
以上是关于VBA研究数组的定义和使用的主要内容,如果未能解决你的问题,请参考以下文章