Option ステートメントとは

VBA の Option ステートメントは、モジュールの先頭(すべてのプロシージャより前)に記述し、そのモジュール全体の動作を制御する宣言です。

ステートメント制御する内容
Option Explicit変数の宣言を強制する
Option Base 0 / Option Base 1配列添字の既定値(省略時は 0)
Option Compare Binary / Option Compare Text文字列比較の大文字小文字区別(省略時は Binary)

💡 記述位置のルール

Option ステートメントはモジュールの最上部、SubFunction の外側に記述します。複数を組み合わせる場合はそれぞれ独立した行に書きます。

Option Explicit — 変数宣言の強制

最も重要な設定です。記述するとすべての変数を DimPublicPrivate で宣言しないとコンパイルエラーになります。

VBA — Option Explicit なし(危険)
' Option Explicit がない場合
Sub DangerousExample()
    Dim totalAmount As Long
    totalAmout = 1000   ' タイポ(totalAmount ではなく totalAmout)
    ' → エラーにならず 0 のまま。totalAmount は変化しない
    MsgBox totalAmount  ' → 0 が表示される(意図は 1000 のはず)
End Sub
VBA — Option Explicit あり(安全)
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始まりになります。

VBA — Option Base の違い
' ---- 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 DatabaseAccess VBA 専用。Accessのロケール設定に準拠
VBA — Option Compare の違い
' モジュール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 ステートメントはモジュールごとに独立しています。プロジェクト全体に一括適用する仕組みはなく、各モジュールの先頭に明示的に記述する必要があります。

VBA — 推奨ヘッダーテンプレート
' ========================================
' モジュール: 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 TextLCase() 正規化
モジュール間の不整合 あるモジュールは Option Base 0、別モジュールは Option Base 1 で混在 プロジェクト内で統一し、コメントで明記

まとめ

VBA プロジェクトの品質を底上げする最小コストの手段が Option ステートメントの正しい設定です。特に Option Explicit はすべてのモジュールに記述することを強く推奨します。

次の章では…

PART 02 では エラーハンドリング を解説します。On Error GoToOn Error Resume Next の使い分け、Err オブジェクトによる詳細取得まで丁寧に解説します。

→ PART 02 — エラーハンドリングへ