【VBA】Option Explicitで変数の宣言を強制する方法|設定と使い方を解説

スポンサーリンク

VBAを書いていて「変数名を打ち間違えたのにエラーにならない」という経験はありませんか?

原因は、VBAが未宣言の変数を自動的に作ってしまう仕組みにあります。スペルミスに気づけず、バグの特定に何時間もかかることも珍しくありません。

そんなトラブルを防いでくれるのが Option Explicit です。この記事では、VBA Option Explicitの意味・設定方法・実践コードをまとめて紹介します。

NOTE

VBEの起動方法や画面の見方は「VBE画面の見方」で解説しています。Alt + F11 でVBEを起動し、「挿入」→「標準モジュール」でコードを書く準備ができます。

VBA Option Explicitとは?

Option Explicit は、モジュール内のすべての変数に Dim などの宣言を必須にする命令です。

モジュールの先頭(宣言セクション)に1行書くだけでOK。宣言なしの変数があると コンパイルエラー になるので、スペルミスや未宣言の変数を即座に検出できます。

Option Explicit  '← モジュールの先頭に書くだけ

Sub SampleMacro()
    Dim sName As String '--- 変数を宣言してから使う ---
    sName = "田中太郎"
    MsgBox sName
End Sub

TIP

Option Explicitはモジュール単位で適用されます。プロジェクト内のすべてのモジュールに記述するか、後述の自動設定を有効にしておきましょう。

Option Explicitがないとどうなる?(スペルミスバグの実例)

「Option Explicitなしでも動くなら、なくていいのでは?」と思うかもしれません。でも実務では、これが原因で見つけにくいバグが発生します。

タイプミスで別変数が作られる

次のコードを見てください。total と書くべきところを totla とタイプミスしています。

Sub CalcWithoutOptionExplicit()
    Dim total As Long '--- 合計金額 ---
    total = 1000

    '--- タイプミスに気づかない ---
    totla = totla + 500  '← total ではなく totla

    MsgBox "合計: " & total  '--- 結果は 1000(500が加算されていない)---
End Sub

このコードを実行すると、エラーは出ません。totla が新しいVariant型変数として自動作成され、total には500が加算されないまま処理が進みます。結果は「合計: 1000」と表示されます。

金額計算でこのバグが混入すると、集計結果が数十万円ずれることもあります。しかもエラーが出ないので、数字を見比べるまで間違いに気づけません。

Option Explicitありなら一瞬で発見

同じコードにOption Explicitを付けると、結果はこう変わります。

Option Explicit

Sub CalcWithOptionExplicit()
    Dim total As Long '--- 合計金額 ---
    total = 1000

    '--- タイプミスに気づかない ---
    totla = totla + 500  '← ここでコンパイルエラーが発生
End Sub

F5キーで実行した瞬間、「コンパイル エラー: 変数が定義されていません。」と表示されます。totla がハイライトされるので、スペルミスの場所が一目瞭然です。

Option Explicitなしで起きる3つのトラブル

トラブル具体例影響
スペルミスが検出されないtotaltotla と書いてもエラーにならない値が空のまま処理が進む
型が曖昧になるすべての変数が Variant 型になるメモリ消費が増え処理速度が低下する
バグの原因特定が困難エラーにならないので原因箇所が分からないデバッグに何時間もかかる

NOTE

数百行のマクロでこのバグが発生すると、原因の特定に何時間もかかります。Option Explicitを設定しておけば一瞬で見つかりますよ。変数の値をリアルタイムで追跡したいときは「ローカルウィンドウ」も合わせて使うと効率的です。

Option Explicitの基本的な使い方

宣言セクションに記述する

Option Explicitは、モジュールの 一番上(宣言セクション)に記述します。

Option Explicit

Sub SampleMacro()
    Dim sName As String '--- 氏名 ---
    sName = "田中太郎"
    MsgBox sName
End Sub

Option ExplicitSub の間に区切り線が自動表示されます。宣言セクションとプロシージャの境目です。

動作確認してみよう

宣言した変数名と違う名前を使うとどうなるか、試してみましょう。

Option Explicit

Sub TestWithOptionExplicit()
    Dim sName As String '--- 氏名 ---
    sName = "田中太郎"

    '--- わざとスペルミスをする ---
    MsgBox sNaem  '← ここでコンパイルエラーが発生
End Sub

このコードをF5キーで実行すると sNaem がハイライトされます。スペルミスを即発見できますね。

比較として、Option Explicitがない場合も見てみましょう。

Sub TestWithoutOptionExplicit()
    Dim sName As String '--- 氏名 ---
    sName = "田中太郎"

    '--- わざとスペルミスをする ---
    MsgBox sNaem  '← エラーにならず空白のメッセージが表示される
End Sub

こちらはエラーが出ません。空のメッセージボックス が表示されるだけです。sNaem がVariant型変数として自動作成され、値はEmpty(空)になります。

Option Explicitを自動入力する設定方法

毎回手入力するのは手間ですよね。VBEの設定を変更すれば、新規モジュール作成時に自動で入力されるようになります。

VBEのオプションで「変数の宣言を強制する」を有効にする

  1. VBEのメニューバーから [ツール] → [オプション] を開く
  2. [編集] タブの「変数の宣言を強制する」にチェックを入れる
  3. [OK] をクリック

これで、新しくモジュールを挿入するたびに Option Explicit が自動挿入されます。

既存モジュールへの反映

注意点がひとつあります。この設定は 新規モジュールにのみ 適用されます。

設定を有効にする前に作成したモジュールには反映されません。既存モジュールには手動で先頭に Option Explicit を追記してください。

TIP

まだ設定していない方は、この記事を読んでいる今がチャンスです。VBEを開いて [ツール] → [オプション] から設定しておきましょう。

変数の型宣言と組み合わせてVBAの品質を上げる

Option Explicitを設定すると、変数の型を意識する習慣が自然につきます。適切な型を指定すれば、処理速度とメモリ効率が改善しますよ。

よく使う型とメモリ比較

メモリ用途具体例
Long4バイト行番号・カウンターDim i As Long
String文字数に応じて変動文字列データDim sName As String
Double8バイト金額・小数を含む数値Dim dTotal As Double
Boolean2バイト真偽値(True/False)Dim bFlg As Boolean
Variant16バイト以上型が不確定な場合のみDim vData As Variant

Variant型は便利ですが、Long型の4倍以上のメモリを消費します。大量データのマクロでは体感できるほど差が出ます。

型宣言を活かした実務コード

Rangeで最終行まで処理するコードを例に見てみましょう。

Option Explicit

Sub SpeedOptimizedMacro()
    Dim ws As Worksheet '--- 対象シート ---
    Dim i As Long '--- 行カウンター ---
    Dim lLastRow As Long '--- 最終行 ---
    Dim sResult As String '--- 処理結果 ---

    Set ws = ThisWorkbook.Sheets("Sheet1")
    lLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '--- A列の値を順番に処理する ---
    For i = 2 To lLastRow
        If ws.Range("A" & i).Value <> "" Then
            sResult = sResult & ws.Range("A" & i).Value & vbCrLf
        End If
    Next i

    MsgBox "処理結果:" & vbCrLf & sResult
End Sub

すべての変数に型を指定しているので、スペルミスも型の曖昧さも発生しません。Do Loopを使う場合も同様に、ループ変数を Long で宣言しておくのがおすすめです。

定数(Const)との併用パターン

Option Explicitと合わせて、変更しない値は定数(Const)で宣言するのがおすすめです。

Option Explicit

'--- 定数の宣言 ---
Const START_ROW As Long = 2 '--- データ開始行 ---
Const SHEET_NAME As String = "売上データ" '--- 対象シート名 ---

Sub ProcessSalesData()
    Dim ws As Worksheet '--- 対象シート ---
    Dim i As Long '--- 行カウンター ---
    Dim lLastRow As Long '--- 最終行 ---
    Dim dTotal As Double '--- 合計金額 ---

    Set ws = ThisWorkbook.Sheets(SHEET_NAME)
    lLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '--- 売上金額を集計する ---
    For i = START_ROW To lLastRow
        dTotal = dTotal + ws.Range("C" & i).Value
    Next i

    MsgBox SHEET_NAME & "の合計金額: " & Format(dTotal, "#,##0") & "円"
End Sub

定数を使うメリットは2つあります。

  • 変更が1か所で済む: シート名や開始行を変えたいとき、定数の値を変えるだけでOK
  • 誤って値を変更できない: 定数に値を代入しようとするとコンパイルエラーになる

Option Explicitを使い忘れるパターンと対策

「設定したつもりなのに効いていない」というケースもあります。よくある原因を整理しておきましょう。

パターン原因対策
自動設定「前」に作ったモジュール設定は新規モジュールにのみ適用される既存モジュールの先頭に手動で追記する
ThisWorkbook・Sheet1などのオブジェクトモジュール標準モジュール以外は見落としやすいオブジェクトモジュールにも必ず記述する
他の人が作ったマクロを引き継いだ前任者が設定していない引き継ぎ時に全モジュールをチェックする
UserFormのコードビハインドフォームモジュールも対象UserFormのコード画面の先頭にも追記する

TIP

プロジェクトエクスプローラーで各モジュールを開き、先頭に Option Explicit があるか1つずつ確認するのが確実です。数が多いときは面倒ですが、一度チェックしてしまえば安心ですよ。

よくあるエラーと対処法

Option Explicitを使い始めると、いくつかのエラーに遭遇することがあります。

エラー原因対処法
コンパイル エラー: 変数が定義されていません。変数を Dim で宣言していないDim 変数名 As 型 で宣言する
コンパイル エラー: 変数が定義されていません。(スペルミス)宣言した変数名と綴りが違うハイライト箇所のスペルを修正する
実行時エラー ’91’オブジェクト変数に Set を使わずに代入したSet ws = ... のように Set を付ける
マクロが実行できないファイルを .xlsx で保存している.xlsm(マクロ有効ブック)に変更する
マクロが無効ですセキュリティ設定でブロックされているトラスト センターでマクロを有効化する

NOTE

「変数が定義されていません。」エラーが出たときは慌てなくて大丈夫です。VBEが原因の変数をハイライトしてくれるので、スペルを確認するか Dim 宣言を追加しましょう。

まとめ

Option Explicitは、VBAの品質を底上げしてくれる設定です。この記事の内容を振り返っておきましょう。

項目ポイント
基本モジュールの先頭に Option Explicit を記述し、変数の宣言を強制する
効果未宣言の変数を使うとコンパイルエラーで即座に教えてくれる
自動設定VBEの [ツール] → [オプション] →「変数の宣言を強制する」で自動挿入できる
型宣言Dim … As 型 で明示的に宣言し、処理速度とメモリ効率を改善する
定数Const と併用して保守性をさらに上げる
注意既存モジュール・オブジェクトモジュール・UserFormにも手動で追記する

まだ設定していない方は、今すぐVBEを開いて設定してみてください。たった1回の操作でデバッグ時間が大幅に減りますよ。

関連記事

VBAの基礎を固めたい方は、こちらの記事もあわせてどうぞ。

タイトルとURLをコピーしました