サーチ…


構文

  • オプションoptionName [値]
  • Option Explicit
  • オプション比較{テキスト|バイナリ|データベース}
  • オプションプライベートモジュール
  • オプションベース{0 | 1}

パラメーター

オプション詳細
明示的それが指定されたモジュールで変数宣言必要とする (理想的にはそれらのすべて)。このオプションを指定すると、宣言されていない(/誤って綴られた)変数を使用するとコンパイルエラーになります。
テキストを比較するシステムのロケールに基づいて、モジュールの文字列比較を大文字小文字を区別しないようにし、アルファベットの等価性を優先します(例: "a" = "A")。
バイナリの比較デフォルトの文字列比較モード。各文字のバイナリ表現/数値(ASCIIなど)を使用して文字列を比較して、モジュールの文字列比較を大文字と小文字を区別するようにします。
データベースの比較 (MS-Accessのみ)モジュールの文字列比較をSQL文での動作と同じように動作させます。
プライベートモジュールモジュールのPublicメンバが、モジュールが常駐するプロジェクトの外部からアクセスされないようにします。つまり、ホストアプリケーションからプロシージャを効果的に隠す(つまり、マクロやユーザー定義関数として使用することはできません)。
オプションベース0 初期設定。モジュール内の暗黙の配列の下限を0に設定します。明示的な下限値なしで宣言された配列は、 0が使用されます。
オプションベース1 暗黙的な配列の下限を1に設定します。明示的な下限値なしで配列が宣言されると、 1が使用されます。

備考

コンパイラがOption Base {0|1}宣言をフォールバックするのではなく、明示的に境界を宣言することで、配列の境界を制御する方がはるかに簡単です。これはそうすることができます:

Dim myStringsA(0 To 5) As String '// This has 6 elements (0 - 5)
Dim myStringsB(1 To 5) As String '// This has 5 elements (1 - 5)
Dim myStringsC(6 To 9) As String '// This has 3 elements (6 - 9)

Option Explicit

VBAで常にOption Explicitを使用すると、使用前にすべての変数を宣言することがベストプラクティスとみなされます。これには、宣言された変数名やIntelliSenseの自動大文字化などの他の利点もあります。

Option Explicit

Sub OptionExplicit()
    Dim a As Integer
    a = 5
    b = 10 '// Causes compile error as 'b' is not declared
End Sub

VBEのツールで変数宣言を必要とする設定►オプション►エディタのプロパティページでは、 Option Explicitステートメントが新しく作成されたコードシートの先頭に配置されます。

require_variable_declaration

これは、スペルミスのような間違ったコードミスを避けるだけでなく、変数宣言で正しい変数型を使用するように影響します。 (いくつかの例は、 常に「Option Explicit」を使用しています)。

オプション比較{バイナリ|テキスト|データベース}

オプション比較バイナリ

バイナリ比較は、モジュール/クラスの大文字と小文字を区別して文字列の等価性をチェックします。技術的には、このオプションを使用すると、各文字のバイナリ表現のソート順を使用して文字列の比較が実行されます。

A <B <E <Z <a <b <e <z

モジュールにOption Compareが指定されていない場合は、デフォルトでバイナリが使用されます。

Option Compare Binary

Sub CompareBinary()

    Dim foo As String
    Dim bar As String
    
    '// Case sensitive
    foo = "abc"
    bar = "ABC"
    
    Debug.Print (foo = bar) '// Prints "False"
    
    '// Still differentiates accented characters
    foo = "ábc"
    bar = "abc"
    
    Debug.Print (foo = bar) '// Prints "False"
    
    '// "b" (Chr 98) is greater than "a" (Chr 97)
    foo = "a"
    bar = "b"
    
    Debug.Print (bar > foo) '// Prints "True"
    
    '// "b" (Chr 98) is NOT greater than "á" (Chr 225)
    foo = "á"
    bar = "b"
    
    Debug.Print (bar > foo) '// Prints "False"

End Sub

オプション比較テキスト

Option Compare Textは、モジュール/クラス内のすべての文字列比較で大文字と小文字を区別しない比較を行います。

(A | a)<(B | b)<(Z | z)

Option Compare Text

Sub CompareText()

    Dim foo As String
    Dim bar As String
    
    '// Case insensitivity
    foo = "abc"
    bar = "ABC"
    
    Debug.Print (foo = bar) '// Prints "True"
    
    '// Still differentiates accented characters
    foo = "ábc"
    bar = "abc"
    
    Debug.Print (foo = bar) '// Prints "False"
    
    '// "b" still comes after "a" or "á"
    foo = "á"
    bar = "b"
    
    Debug.Print (bar > foo) '// Prints "True"

End Sub

オプション比較データベース

オプションデータベースの比較は、MS Access内でのみ可能です。テキスト/バイナリモードのどちらを使用するかを決定するために、現在のデータベース設定を使用するようにモジュール/クラスを設定します。

注:この設定は、データベース内のSQL照会と同じ方法でテキスト比較を処理するカスタムAccess UDF(ユーザー定義関数)の作成にモジュールを使用しない限り、この設定の使用はお勧めしません。

オプションベース{0 | 1}

Option 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

2番目の例では、配列のインデックス0にアクセスしようとしたためにサブスクリプトが最初のループステージで範囲外になりました(エラー9)。モジュールがBase 1宣言されているためこのインデックスは存在しません

ベース1の正しいコードは次のとおりです。

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

Split関数は、 Option Base設定に関係なく、 常に 0から始まる要素インデックスを持つ配列を作成することに注意してください。 スプリット機能の使い方の例は、 ここで見つけることができます

分割機能
指定された数の部分文字列を含む0から始まる1次元配列を返します。

Excelでは、複数セル範囲のRange.ValueおよびRange.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は、配列が作成されるすべてのコードモジュールの先頭になければなりません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow