🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の Option Explicit — 静かなタイプミスを、大声のコンパイルエラーに変える

|

Excel VBA の Option Explicit — 静かなタイプミスを、大声のコンパイルエラーに変える

TL;DR — すべてのモジュールの一番上に Option Explicit を置くと、宣言していない変数を使うマクロを VBA は 実行そのものを拒否 します。これがなければ、totalSaies のようなタイプミスはエラーになりません — VBA が黙って新しい空の変数を作り、合計は 0 で返り、誰も警告してくれません。これは実行時のコードでは なく ディレクティブ です。コンパイル 時に走るので、間違いは 1 行も実行される前に表面化します。 ツール > オプション > 変数の宣言を強制する を一度オンにすれば、新しいモジュールすべてに自動で 追加されます。

Option Explicit          ' <- 常にモジュールの最初の行

Sub Report()
    Dim totalSales As Long
    totalSales = 100
    MsgBox totalSaies      ' タイプミス! Option Explicit があれば "Variable not defined" — 実行されない
End Sub                    ' なければ: MsgBox は空白/0 を出し、誰も気づかない

この記事で学べること

  • 考え方の軸 — VBA は、あなたが打つすべての名前に対して変数を勝手に作り出す
  • 静かなタイプミスバグと、1 行がそのクラス全体をどう潰すか
  • なぜモジュール単位なのか、そして自動で追加してくれる設定
  • 古いコードで Variable not defined が点灯したときにすべきこと
  • なぜ 宣言 は強制するのに データ型 は強制しないのか(よくある取り違え)
  • 意見:1 行を書く前にオンにすべき、たった 1 つの設定

考え方の軸:VBA はあなたの背後で変数を勝手に作る

既定では、VBA は一度も見たことのない どんな 名前も、その場で新しい変数を作る要求として扱います — 型は Variant、中身は Empty です。便利そうに聞こえます。それが罠です。つまり VBA は、あなたが使う つもりだった変数と、あなたが 打ち間違えた 変数の区別がつかないのです。どちらも「見たことのない名前」に すぎず、どちらも黙って作られます。

Option Explicit は、その便利さを取り上げます。これをモジュールの一番上に置くと、ルールが逆転します。 すべて の変数は、使う前に宣言されていなければなりません(DimPrivatePublicStaticConst、 あるいはパラメータで)。宣言していない名前を打つと、コンパイラは Variable not defined で止まります — マクロが走り出す前に。ほんの少しのタイプ量と引き換えに、コードのすべての名前があなたの意図したもので あるという、コンパイラの約束を手に入れたのです。

マクロが決して実行しない 3 つのトークン

Option Explicit は小さな一族に属します — あなたが打ち込むのに、走っているマクロが決して実行しない 3 つのものです。これらは実行ではなく ソースコンパイル を形づくります。だからこそ初心者は 飛ばし、飛ばすと痛い目を見ます。

トークン ソースに対して何をするか 実行時のコスト
' コメント メモを残し、コンパイラが削除するコードを無効化する なし — 決して実行されない
_ 行継続 1 つの長い文を複数行に分割する なし — パーサーが消し去る
Option Explicit すべての名前に宣言を強制する コンパイル 時に走るので、タイプミスはマクロが始まる前に死ぬ

3 つのうち 2 つはコンパイル前に消されます。Option Explicit は、唯一 行動する 側です — 名前を取り締まれと コンパイラに命じます。3 つの中で最もレバレッジが高いのは、これが捕まえるバグが最も高くつく種類だからです — エラーではなく間違った答えを生み出すバグです。

それが潰すバグ:ゼロを返すタイプミス

Option Explicit を使うべき理由のすべてが、8 行に収まります。なしの場合:

Sub Totals()
    Dim revenue As Currency
    revenue = 5000
    ' ...40 行あと...
    MsgBox "Revenue: " & revanue   ' タイプミス: revAnue
End Sub

revanue は宣言されていないので、VBA はそれを空の Variant として作ります。メッセージボックスは Revenue: — 空白 — と表示し、エラーも、警告も、赤い文字も、一切ありません。本物のレポートでは、それは 信頼している相手に届いた間違った数値です。これは「マクロが間違った答えを出すのにクラッシュしない」という 最も一般的な原因であり、誰かが合計のずれに気づくまで完全に見えないままです。

1 行足せば、同じタイプミスが乗り越えられない壁に変わります。

Option Explicit

Sub Totals()
    Dim revenue As Currency
    revenue = 5000
    MsgBox "Revenue: " & revanue   ' Compile error: Variable not defined (revanue が強調表示される)
End Sub

マクロは起動すらしません。コンパイラは revanue を強調表示し、問題に名前を付けます。静かに出荷された 間違いではなく、10 秒で済む修正です。

モジュール単位だから、設定に足させる

Option Explicit が守るのは それが置かれたモジュールだけ です。Module1 に足しても、Module2 は 無防備なまま。明日挿入する新しいモジュールには 1 つもありません。すべてのモジュールの一番上に自分で 打ち込むのを当てにするのは、まさに、最も必要な忙しい日に破綻する種類の規律です。

だから自分を当てにしないこと。VBA エディタで ツール > オプション > 編集 を開き、変数の宣言を強制する にチェックを入れます。これ以降、あなたが挿入する 新しい モジュールはどれも、最初の行に自動で Option Explicit が付きます。安全な既定を実際の既定にする、一度きりのクリックです — VBA を書くどの マシンでも、真っ先に設定すべきものです。

知っておく価値のある注意点が 1 つ。この設定が効くのは、チェックを入れた あと に作られたモジュール だけです。すでに存在するモジュールはそれまでのままなので、古いモジュールには引き続き手で行を足します。

古いコードでオンにする:赤い壁こそが狙い

宣言されていない変数だらけのモジュールに Option Explicit を足すと、最初のコンパイルは配電盤のように 点灯します — 名前という名前に Variable not defined が。それはディレクティブが意地悪をしているのでは ありません。あなたの古いコードが盲目で飛んでいた場所を、一つ残らず見せてくれているのです。強調表示された 名前はどれも、宣言すべき本物の変数か、これまで捕まえられなかったタイプミスのどちらかです。

一つずつ片づけましょう。本物は宣言し(Dim customerName As String — やり方は VBA Dim を参照)、タイプミスは直します。一度きり面倒で、そのあとは永遠に安全です。モジュールが巨大なら、行を足して コンパイルし、デバッグ > コンパイル でエディタに未宣言の名前まで案内させます。あなたは仕事を増やして いるのではありません。すでにそこにあったバグを換金しているのです。

宣言は強制するが、データ型は強制しない

よくある誤読:Option Explicit は VBA を 強く型付け すると思われがちです。しません。これは変数を 宣言 することを強制しますが、型のない宣言はやはり Variant です。

Option Explicit

Dim count            ' Option Explicit のもとで合法 — でも Variant のまま
Dim count As Long    ' これがあなたの本当に欲しいもの — 型付きの変数

Dim countOption Explicit を満たしますが(名前は宣言されている)、As Long の速度も型安全性も まったく与えません。Option Explicit未宣言の名前 という穴をふさぎます。本物の型を選ぶこと (As LongAs StringAs Range)は別の、同じくらい価値ある習慣で、VBA Data Types で扱います。まず 1 つ目をオンにし、それから 2 つ目を身につけましょう。

意見:これが真っ先にオンにすべき、たった 1 つの設定

Option Explicit に反対する誠実な議論はありません。コストは、どのみち書くべき数行の Dim。見返りは、 VBA で最も時間を溶かすバグ — ゼロを返して出荷される静かなタイプミス — への免疫です。経験を積んだ VBA 開発者はみな、新しいマシンで何かを書く前に 変数の宣言を強制する をオンにし、Option Explicit のない モジュールを未完成として扱います。

このクラスターから 1 つだけ持ち帰るなら、これにしてください。いま設定にチェックを入れ、すでに持っている モジュールに行を足し、打ち間違えた変数のせいだと判明する間違った合計を追って、二度と午後を溶かさない こと。この言語で最も安い保険です。

欲しい保証が 1 つの変数ではなく、マクロ全体のとき

Option Explicit は、あなたの 名前 が本物であることを保証します。あなたの ロジック が正しいことは 保証できません。賭け金が顧客向けの数値なら、変数が存在することだけでなく、出力が正しいことを確かめる 何かがやはり欲しくなります。ExcelMaster は、普通の言葉のゴール — 「この 2 つのシートを突き合わせて、合計が食い違う行をすべてフラグして」 — を受け取り、コードを書き、ワークブックをバックアップし、それを実行して、チェックに落ちた行を返します。 あなたは期待する結果を説明するだけ。あとは実行し、現実と期待が分かれる場所を見せてくれます — どんな 単一のディレクティブにも与えられない水準の安全です。

よくある質問

VBA の Option Explicit は何をしますか?

すべての変数を使う前に宣言することを強制します。モジュールの一番上に Option Explicit があると、宣言 していない名前は Variable not defined のコンパイルエラーを引き起こすので、タイプミスや未宣言の変数は、 黙って空の Variant になる代わりに、マクロが走る前に捕まります。

Option Explicit はどこに置きますか?

モジュールの一番最初の行、すべての SubFunction より上、モジュールの宣言セクションです。効くのは そのモジュールだけなので、守りたいモジュールそれぞれの一番上に置きます。

Option Explicit を自動で追加するには?

VBA エディタで ツール > オプション > 編集 を開き、変数の宣言を強制する にチェックを入れます。以降、 VBA は作成するすべての新しいモジュールの一番上に Option Explicit を挿入します。すでに存在するモジュールには 追加されません — そちらは手で更新します。

Option Explicit を足したら Variable not defined が出るのはなぜですか?

そのモジュールに、あなたが一度も宣言していない変数があるからです — たいていはタイプミス、ときには Dim し忘れただけの名前です。コンパイラが一つずつ強調表示します。本物の変数は宣言し(例:Dim total As Long)、 打ち間違えたものは直しましょう。どのエラーも、ディレクティブがたった今あぶり出した潜在バグです。

Option Explicit はデータ型を強制しますか?

いいえ。強制するのは 宣言 であって、型付け ではありません。Dim count はそれを満たしますが、やはり Variant です。型安全性と速度を得るには、自分で型を足します — Dim count As Long — これは別の良い習慣です。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-06.

関連ガイド: VBA Comment · VBA Line Continuation · VBA Dim · VBA Data Types · VBA Debug.Print