选项基础 0 1

Option Base 用于声明数组元素的默认下限。它在模块级别声明,仅对当前模块有效。

默认情况下(因此如果未指定 Option Base),Base 为 0.这意味着模块中声明的任何数组的第一个元素的索引为 0。

如果指定了 Option Base 1,则第一个数组元素的索引为 1

基数为 0 的示例:

Option Base 0

Sub BaseZero()

    Dim myStrings As Variant
    
    ' Create an array out of the Variant, having 3 fruits elements
    myStrings = Array("Apple", "Orange", "Peach")
    
    Debug.Print LBound(myStrings) ' This Prints "0"
    Debug.Print UBound(myStrings) ' This print "2", because we have 3 elements beginning at 0 -> 0,1,2
            
    For i = 0 To UBound(myStrings)
    
        Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
    
    Next i

End Sub

基础 1 的相同示例

Option Base 1

Sub BaseOne()

    Dim myStrings As Variant
    
    ' Create an array out of the Variant, having 3 fruits elements
    myStrings = Array("Apple", "Orange", "Peach")
    
    Debug.Print LBound(myStrings) ' This Prints "1"
    Debug.Print UBound(myStrings) ' This print "3", because we have 3 elements beginning at 1 -> 1,2,3
            
    For i = 0 To UBound(myStrings)
    
        Debug.Print myStrings(i) ' This triggers an error 9 "Subscript out of range"
    
    Next i

End Sub

第二个示例在第一个循环阶段生成了一个超出范围(错误 9)的下标,因为尝试访问数组的索引 0,并且该索引不存在,因为模块是使用 Base 1 声明的

Base 1 的正确代码是:

    For i = 1 To UBound(myStrings)
    
        Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
    
    Next i

应该注意的是,无论任何 Option Base 设置, Split 函数 总是创建一个具有从零开始的元素索引的数组。有关如何使用 Split 功能的示例,请参见此处

  • 分割功能
    返回包含指定数量子字符串的从零开始的一维数组。

在 Excel 中,多单元格范围的 Range.ValueRange.Formula 属性始终返回基于 1 的 2D Variant 数组。

同样,在 ADO 中,Recordset.GetRows 方法始终返回基于 1 的 2D 数组。

一个推荐的最佳实践是始终使用 LBoundUBound 函数来确定数组的范围。

'for single dimensioned array
Debug.Print LBound(arr) & ":" & UBound(arr)
Dim i As Long
For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next i

'for two dimensioned array
Debug.Print LBound(arr, 1) & ":" & UBound(arr, 1)
Debug.Print LBound(arr, 2) & ":" & UBound(arr, 2)
Dim i As long, j As Long
For i = LBound(arr, 1) To UBound(arr, 1)
    For j = LBound(arr, 2) To UBound(arr, 2)
         Debug.Print arr(i, j)
    Next j
Next i

Option Base 1 必须位于创建数组的每个代码模块的顶部,如果要以 1 的下边界始终创建数组,则重新标注尺寸。