Option ステートメントとは
VBA の Option ステートメントは、モジュールの先頭(すべてのプロシージャより前)に記述し、そのモジュール全体の動作を制御する宣言です。
| ステートメント | 制御する内容 |
|---|---|
Option Explicit | 変数の宣言を強制する |
Option Base 0 / Option Base 1 | 配列添字の既定値(省略時は 0) |
Option Compare Binary / Option Compare Text | 文字列比較の大文字小文字区別(省略時は Binary) |
💡 記述位置のルール
Option ステートメントはモジュールの最上部、Sub や Function の外側に記述します。複数を組み合わせる場合はそれぞれ独立した行に書きます。
Option Explicit — 変数宣言の強制
最も重要な設定です。記述するとすべての変数を Dim・Public・Private で宣言しないとコンパイルエラーになります。
' Option Explicit がない場合
Sub DangerousExample()
Dim totalAmount As Long
totalAmout = 1000 ' タイポ(totalAmount ではなく totalAmout)
' → エラーにならず 0 のまま。totalAmount は変化しない
MsgBox totalAmount ' → 0 が表示される(意図は 1000 のはず)
End Sub
Option Explicit
Sub SafeExample()
Dim totalAmount As Long
totalAmout = 1000 ' ← コンパイルエラー:変数が定義されていません
End Sub
✅ VBEで自動挿入を有効にする
VBE(Alt+F11)→ ツール → オプション → 編集タブ →「変数の宣言を強制する」にチェックを入れると、新規モジュール作成時に自動で Option Explicit が挿入されます。
Option Base — 配列添字の規定値
VBA の配列は既定で 0始まりです。Option Base 1 を宣言すると1始まりになります。
' ---- Option Base 0 の場合(既定)----
Option Base 0
Sub TestBase0()
Dim arr(3) As String ' arr(0) ~ arr(3) の4要素
arr(0) = "最初"
arr(3) = "最後"
Debug.Print LBound(arr) ' → 0
Debug.Print UBound(arr) ' → 3
End Sub
' ---- Option Base 1 の場合 ----
' Option Base 1
Sub TestBase1()
Dim arr(3) As String ' arr(1) ~ arr(3) の3要素
arr(1) = "最初"
arr(3) = "最後"
Debug.Print LBound(arr) ' → 1
Debug.Print UBound(arr) ' → 3
End Sub
⚠️ Option Base の落とし穴
Split() や Array() などのVBA組み込み関数が返す配列は、Option Base に関わらず常に 0 始まりです。Option Base 1 環境でも LBound() で下限を確認する習慣が重要です。
Option Compare — 文字列比較モード
文字列の = 比較、Like 演算子、InStr() などの大文字小文字の扱いを制御します。
| モード | 内容 | 例 "A" = "a" |
|---|---|---|
Option Compare Binary(既定) | バイナリ順で比較。大文字小文字を区別する | False |
Option Compare Text | 大文字小文字を区別しない | True |
Option Compare Database | Access VBA 専用。Accessのロケール設定に準拠 | — |
' モジュールA — Option Compare Binary(既定)
Option Compare Binary
Sub TestBinary()
Debug.Print ("ABC" = "abc") ' → False(区別する)
Debug.Print ("ABC" Like "a*") ' → False
End Sub
' モジュールB — Option Compare Text
Option Compare Text
Sub TestText()
Debug.Print ("ABC" = "abc") ' → True(区別しない)
Debug.Print ("ABC" Like "a*") ' → True
End Sub
💡 日本語環境での注意
Option Compare Text は全角/半角の区別も環境によって変わることがあります。ファイル名やキー比較など厳密性が求められる箇所では Binary を使い、必要に応じて LCase() や UCase() で正規化してから比較するのが確実です。
モジュール単位 vs 自動挿入設定
Option ステートメントはモジュールごとに独立しています。プロジェクト全体に一括適用する仕組みはなく、各モジュールの先頭に明示的に記述する必要があります。
' ========================================
' モジュール: modSample
' 説明 : サンプルモジュール
' ========================================
Option Explicit
Option Base 1 ' 必要な場合のみ(通常は省略)
Option Compare Binary ' 既定値だが意図を明示するために記述する場合もある
よくある落とし穴集
| パターン | 問題 | 対策 |
|---|---|---|
| 変数名のタイポ | Option Explicit なしでは暗黙的に別変数が生成され、意図した変数が更新されない |
Option Explicit を必ず記述 |
Split()の添字 |
Option Base 1 でも Split は 0 始まり。arr(1) にアクセスすると正しいが arr(0) が空になる |
LBound()/UBound() で動的に範囲を確認 |
| 大文字小文字の比較 | ユーザー入力の比較で大文字小文字の差を見落とす | Option Compare Text か LCase() 正規化 |
| モジュール間の不整合 | あるモジュールは Option Base 0、別モジュールは Option Base 1 で混在 |
プロジェクト内で統一し、コメントで明記 |
まとめ
VBA プロジェクトの品質を底上げする最小コストの手段が Option ステートメントの正しい設定です。特に Option Explicit はすべてのモジュールに記述することを強く推奨します。
✅ 次の章では…
PART 02 では エラーハンドリング を解説します。On Error GoTo と On Error Resume Next の使い分け、Err オブジェクトによる詳細取得まで丁寧に解説します。