为什么Excel数组常量基数为1?

时间:2017-05-09 09:59:38

标签: vba excel-vba excel

如果您使用此代码并运行它,您会看到数组的初始化以1开头而不是0开始。

Option Explicit

Public Sub TestMe()

    Dim x() As Variant
    x = [{"A", "B"}]
    PrintArray x

    'this gives an error:
    'Debug.Print x.Count
'-----------------------------------------------------------------

    Dim k As Variant
    k = Array("C", "D")
    PrintArray k

End Sub

Public Sub PrintArray(ByRef myArray As Variant)

    Dim lngCounter As Long

    For lngCounter = LBound(myArray) To UBound(myArray)
        Debug.Print lngCounter; " -> "; myArray(lngCounter)
    Next lngCounter
    Debug.Print TypeName(myArray)

End Sub

知道为什么吗? 这是即时窗口:

 1  -> A
 2  -> B
Variant()
 0  -> C
 1  -> D
Variant()

它看起来像Collection,但当我debug.print x.count时,它会出错。

如果它是range,那么它应该在TypeName中给出一个范围,如下所示:

Public Sub TestMe()    
    Dim p As Variant
    Set p = Range("A1")
    Debug.Print TypeName(p)    
End Sub

1 个答案:

答案 0 :(得分:2)

使用值初始化数组时,它将始终使用标准VBA Lbound为1。 使用Array()初始化数组时,它将使用您在Option Base中指定的任何内容(默认为0)。 如果您将Option Base 1放在模块的开头,并运行测试,您将看到它一直运行。 MSDN on Array()