選項基礎 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 的下邊界始終建立陣列,則重新標註尺寸。