サーチ…
構文
- オプション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ステートメントが新しく作成されたコードシートの先頭に配置されます。
これは、スペルミスのような間違ったコードミスを避けるだけでなく、変数宣言で正しい変数型を使用するように影響します。 (いくつかの例は、 常に「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配列を返します。
一つのお勧め「ベスト・プラクティスは、」常に使用することです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
は、配列が作成されるすべてのコードモジュールの先頭になければなりません。