选项基础 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.Value
和 Range.Formula
属性始终返回基于 1 的 2D Variant 数组。
同样,在 ADO 中,Recordset.GetRows
方法始终返回基于 1 的 2D 数组。
一个推荐的最佳实践是始终使用 LBound 和 UBound 函数来确定数组的范围。
'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 的下边界始终创建数组,则重新标注尺寸。