8

很抱歉问这样一个基本问题,但这让我发疯......

VBA 中的什么函数返回数组中元素的数量...即当数组为空时,它将返回 0?

我不能用 UBound 执行此操作,因为它在空数组上调用时会引发错误,而且我无法相信通过使用 OnError 首先确定其是否为空来执行此操作的方法......正如论坛上所建议的那样!array.Length 抱怨一个糟糕的限定符或其他东西。

我真的需要这样做:

dim termAry() as String
populate termAry
...

private sub populate(terms() as String)
   redim preserve terms(terms.Length) ' Redim takes ubound for array size
   terms(ubound(terms)) = "something really annoying"
end sub

PS 任何指向一组简洁 VBA 语言和函数参考的好的链接都是最有用的...... MSDN 似乎真的很晦涩!

4

1 回答 1

11

我相信做到这一点的唯一方法是使用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
于 2013-05-08T11:29:48.033 回答