我相信做到这一点的唯一方法是使用On Error
和处理Subscript Out of Range
如果未初始化数组(或您感兴趣的数组的维度)将引发的错误。
例如
Public Function IsInitialized(arr() As String) As Boolean
On Error GoTo ErrHandler
Dim nUbound As Long
nUbound = UBound(arr)
IsInitialized = True
Exit Function
ErrHandler:
Exit Function
End Function
Dim a() As String
Dim b(0 To 10) As String
IsInitialized(a) ' returns False
IsInitialized(b) ' returns True
您可以将其概括为测试数组中有多少维,例如
Public Function HasAtLeastNDimensions(arr() As String, NoDimensions As Long) As Boolean
On Error GoTo ErrHandler
Dim nUbound As Long
nUbound = UBound(arr, NoDimensions)
HasAtLeastNDimensions = True
Exit Function
ErrHandler:
Exit Function
End Function
Dim a() As String
Dim b(0 To 10) As String
Dim c(0 To 10, 0 To 5) As String
HasAtLeastNDimensions(a, 1) ' False: a is not initialized
HasAtLeastNDimensions(b, 1) ' True: b has 1 dimension
HasAtLeastNDimensions(b, 2) ' False: b has only 1 dimension
HasAtLeastNDimensions(c, 2) ' True: c has 2 dimensions
更新
回应评论:
我是否认为该函数不能轻易泛化以对任何数组类型进行操作
通过将参数设为 Variant 并使用函数检查它是否是函数体中的数组,可以很容易地概括它IsArray
:
Public Function HasAtLeastNDimensions(arr As Variant, NoDimensions As Long) As Boolean
On Error GoTo ErrHandler
Dim nUbound As Long
If Not IsArray(arr) Then Exit Function
nUbound = UBound(arr, NoDimensions)
HasAtLeastNDimensions = True
Exit Function
ErrHandler:
Exit Function
End Function