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