VBA中数组默认下标下界为从零开始,有些同学喜欢下标下界从一开始,这只是编程习惯不同,无对错之分。
现有一个VBA自定义函数,参数为下标上界,函数返回值为一维数组,代码较简单,不再逐句讲解。
Option Base 1
Function GetArr(intCnt As Integer) As Variant
Dim intInd As Integer
Dim arrRes()
intInd = 0
ReDim arrRes(intInd To intCnt)
For i = intInd To intCnt
arrRes(i) = i
Next
GetArr = arrRes()
End Function
Sub Demo()
Debug.Print Join(GetArr(4))
End Sub
运行Demo过程输出结果如下。
0 1 2 3 4
大家是否注意到了,第一行代码指定数组下标下届从1开始,但是函数GetArr
中数组下标下界是由变量intInd
决定的,此变量的值是Hard Code。
实例需求:自定义函数返回值为数组,该数组的下标下届是否可以和Option Base
设置保持一致。
有的同学想到一个方法,在VBA中读取代码模块,然后就可以知道Option Base
设置下界值,如果没有这行代码,那么下界值为零。这不失为一个方法,但是局限性很大,用户必须要启用“信任对VBA工程对象模型的访问”,否则无法使用。
其实不妨换个思路,既然是和Option Base
设置保持一致,那么可以取巧的使用检测数组下标下届的方法得到这个设置。
实例代码如下。
Option Base 1
Function GetArr1(intCnt As Integer) As Variant
Dim intInd As Integer
Dim arrRes(), tmp(1)
intInd = LBound(tmp)
ReDim arrRes(intInd To intCnt)
For i = intInd To intCnt
arrRes(i) = i
Next
GetArr1 = arrRes()
End Function
Sub demo1()
Debug.Print Join(GetArr1(4))
End Sub
【代码解析】
自定义函数主要部分同前,区别在于第4行代码声明了一个临时数组变量tmp()
,第5行代码使用LBound
函数获取数组下标下界,无论当前模块种是否包含Option Base
语句,都可以快速的获取下界值。
运行Demo过程输出结果如下。
1 2 3 4