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 は、その便利さを取り上げます。これをモジュールの一番上に置くと、ルールが逆転します。
すべて の変数は、使う前に宣言されていなければなりません(Dim・Private・Public・Static・Const、
あるいはパラメータで)。宣言していない名前を打つと、コンパイラは 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 count は Option Explicit を満たしますが(名前は宣言されている)、As Long の速度も型安全性も
まったく与えません。Option Explicit は 未宣言の名前 という穴をふさぎます。本物の型を選ぶこと
(As Long・As String・As 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 はどこに置きますか?
モジュールの一番最初の行、すべての Sub と Function より上、モジュールの宣言セクションです。効くのは
そのモジュールだけなので、守りたいモジュールそれぞれの一番上に置きます。
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
