【この記事について】本記事は 2026年9月12日 時点で確認した内容です。対象環境:Windows 版 Excel(Microsoft 365 / Excel 2021・2019)の VBA(Visual Basic for Applications)。Mac 版・Web 版では画面の名称や一部の表示が異なります。コードはご自身のブックのコピーで試してください。掲載しているエラーメッセージの意味と各ステートメントの仕様は、Microsoft の公式ドキュメント(記事末尾に出典)にもとづいています。本記事の内容の利用は、ご自身の判断と責任でお願いします。
「マクロを実行したら、動き出す前に『コンパイルエラー』と出て止まった」
「エラー番号が出ないから、調べようにも何を調べればいいか分からない」
「コードの一部が青く反転しているけれど、どこが悪いのか見当もつかない」
先に結論です。コンパイルエラーは「マクロが動く前」に出るエラーで、原因は実行中のデータではなく、ほぼ必ずコードの書き方そのものです。そして止まった場所は VBA が青く反転して教えてくれています。だから直し方は決まっています ── 青い反転とダイアログの文章を読み、対応する原因を1つずつ当てていくだけです。データを疑う必要はありません。
この記事では、事務職の方が実際につまずくパターンを7つに整理しました。いちばん多いのは「変数名のスペルミス」で、しかもこれは設定を1行足すだけで、以後は VBA が自動で見つけてくれるようになります。最後に「二度とコンパイルエラーで止まらない3つの習慣」も置きました。焦らず、上から順に見ていきましょう。
- まず「動く前」か「動いている途中」かを見分ける(症状別 早見表)
- そもそも「コンパイルエラー」とは何が起きているのか
- 原因1:変数名のスペルミス(「変数が定義されていません」/最多)
- 原因2:全角スペース・全角記号が混ざっている(「無効な文字です」「構文エラー」)
- 原因3:If・For・Do・With の閉じ忘れ(「End If がありません」など)
- 原因4:Sub や Function の名前が違う/置き場所が違う
- 原因5:宣言や命令を書いた「場所」が違う
- 原因6:同じ名前を2回つくっている
- 原因7:参照設定が切れている(「ユーザー定義型は定義されていません」)
- 「ByRef 引数の型が一致しません」は実行時エラー13とは別物
- 二度とコンパイルエラーで止まらない3つの習慣
- よくある質問(Q&A)
- まとめ:コンパイルエラーは「まだ何も起きていない」という合図
まず「動く前」か「動いている途中」かを見分ける(症状別 早見表)
エラーの直し方は、出たタイミングで真っ二つに分かれます。ここを間違えると、いくら調べても答えが出てきません。最初に次の表で自分の症状を確かめてください。
| コンパイルエラー(この記事) | 実行時エラー | |
|---|---|---|
| 出るタイミング | マクロが動き出す前 | 動いている途中 |
| エラー番号 | 番号が出ない(「コンパイルエラー」と文章だけ) | 「実行時エラー ’13’:」のように番号が出る |
| 止まった場所の色 | 青く反転する(選択された状態) | [デバッグ]を押すと黄色く反転する |
| [デバッグ]ボタン | 出ない([OK]と[ヘルプ]だけ) | 出る |
| 原因のありか | コードの書き方 | セルの中身・シート名・ファイルの状態 |
| ファイルを変えると | 何度やっても同じところで止まる | ブックによって出たり出なかったりする |
青く反転して番号が出ていなければ、この記事の内容です。そのまま読み進めてください。黄色く反転して番号が出ていた場合は、この記事の最後にある「次に読む」から番号ごとの記事へ進んでください。
そもそも「コンパイルエラー」とは何が起きているのか
VBA は、マクロを実行する直前にコードを1回ぜんぶ読み直して、文法として成立しているかを確かめます。この読み直しの作業をコンパイルと呼びます。人間でいえば、書き終えた文章を声に出す前に、いちど目で追って「文が途中で切れていないか」を確認するのに近い作業です。
ここで文法として読めない箇所が見つかると、1行も実行せずに止まります。これがコンパイルエラーです。裏を返せば、コンパイルエラーが出ている間、マクロはまだ何もしていません。データが壊れる心配はないので、その点は安心してください。
大事な性質が3つあります。
- 止まる場所は毎回同じ。データやブックを変えても、直すまで同じところで止まります(=再現するので必ず直せます)。
- 青く反転した箇所が、VBA が「読めなかった」と言っている場所。ただし原因はその少し前の行にあることも多いです(閉じ忘れが典型)。
- 実行しなくても、先にまとめて見つけられる。VBE(Visual Basic Editor)のメニュー[デバッグ]→[VBAProject のコンパイル]を押すと、実行しないままチェックだけが走ります。
この最後の1つは、覚えておくと本当に楽になります。マクロを書いたら、実行の前にまず[VBAProject のコンパイル]。これだけで「実行してみたら動く前に怒られる」という遠回りが無くなります。

原因1:変数名のスペルミス(「変数が定義されていません」/最多)
圧倒的に多いのがこれです。宣言した名前と、使っている名前が1文字違っています。
Option Explicit
Sub 集計する()
Dim goukei As Long
goukei = 0
gokei = goukei + Cells(2, 1).Value ' ← goukei ではなく gokei と書いている
End Sub
この場合、gokei が青く反転して「変数が定義されていません」と出ます。Microsoft の公式ドキュメントも、このメッセージは「宣言していない名前を使っている」ときに出るものと説明しています。よくあるのは次のような取り違えです。
goukeiとgokei(ローマ字のつづりが揺れる)sheet1とSheet1(大文字小文字は VBA では区別されませんが、別の名前だと思い込んでいるケース)DataとDataa(打ち間違い)- コピーしてきたコードの変数名だけ書き換え忘れた
直し方:青く反転した名前を、Dim の行と見比べる
ダイアログで[OK]を押すと、問題の名前が青く選択された状態で残ります。その名前をそのまま Ctrl + C でコピーし、Dim の行と1文字ずつ見比べてください。目で追うより確実です。
これを「二度とやらない」ための1行
モジュールのいちばん上に、次の1行を入れてください。
Option Explicit
これは「宣言していない変数を使ったらエラーにする」という指示です。公式ドキュメントでも、モジュール内のすべての変数を明示的に宣言することを強制する指定として説明されています。一見きびしい設定に見えますが、実際は逆です。スペルミスを、実行する前に VBA が全部見つけてくれるようになります。
この1行が無いと、gokei は「新しい空っぽの変数」として黙って受け入れられます。エラーは出ませんが、合計はいつまでも 0 のまま。原因の分からないバグに化けるほうが、よほど厄介です。
毎回手で書くのが面倒なら、VBE の[ツール]→[オプション]→[編集]タブで「変数の宣言を強制する」にチェックを入れておくと、新しいモジュールに自動で入るようになります。
原因2:全角スペース・全角記号が混ざっている(「無効な文字です」「構文エラー」)
日本語環境で地味に多いのがこれです。見た目ではほとんど分かりません。
- インデント(字下げ)を全角スペースで入れてしまった
=()”のように記号が全角になっている- Web ページや Word からコピーしたときに、引用符が「”」(全角の飾り引用符)に変わっていた
このとき出るのは「無効な文字です」、または「構文エラー」です。どちらも VBA が「この文字は読めません/文として成立していません」と言っている状態です。
直し方:怪しい行を消して、半角で打ち直す
全角と半角は画面上で区別しづらいので、直そうとせず、その行をまるごと削除して半角で打ち直すのが最短です。とくに Web からコピーしたコードは、いちど「メモ帳」に貼り付けてから VBE に貼り直すと、余計な装飾が落ちて安全です。
なお、文字列の中("..." の内側)とコメント(' の後ろ)は日本語でも全角でも問題ありません。見るべきなのは、コードの骨組みの部分だけです。
原因3:If・For・Do・With の閉じ忘れ(「End If がありません」など)
「開いたのに閉じていない」系です。メッセージがそのまま答えを教えてくれる、いちばん親切なパターンです。
| 出るメッセージ | 足りないもの |
|---|---|
| If ブロックに対応する End If がありません | End If |
| End If に対応する If ブロックがありません | If(または End If が1つ多い) |
| For に対応する Next がありません | Next |
| Next に対応する For がありません | For(または Next が1つ多い) |
| Loop に対応する Do がありません | Do |
| Select Case に対応する End Select がありません | End Select |
典型例です。
Sub 判定する()
Dim i As Long
For i = 2 To 10
If Cells(i, 1).Value > 100 Then
Cells(i, 2).Value = "多い"
Next i ' ← End If を書く前に Next が来ている
End Sub
直すとこうなります。
Sub 判定する()
Dim i As Long
For i = 2 To 10
If Cells(i, 1).Value > 100 Then
Cells(i, 2).Value = "多い"
End If
Next i
End Sub
閉じ忘れを見つけるコツ:インデントを揃える
Tab キーで字下げを揃えると、閉じ忘れは目で見つかります。If と End If、For と Next が同じ深さに並んでいるかを確かめてください。縦にそろっていない行が、そのまま犯人です。
なお、If ~ Then ~ を1行で書いた場合は End If が不要です。ここが混乱しやすいところです。
' 1行で書くなら End If は書かない
If x > 100 Then Cells(1, 2).Value = "多い"
原因4:Sub や Function の名前が違う/置き場所が違う
別のマクロを呼び出しているときに出ます。メッセージは「Sub または Function が定義されていません」です。呼び出し側の名前が青く反転します。
Sub 全部やる()
Call 集計スル ' ← 実際の名前は「集計する」
End Sub
Sub 集計する()
' 中身
End Sub
確認する点は3つです。
- 名前が1文字も違わないか(全角・半角、送り仮名、アンダースコアの有無)
- 呼びたいマクロが Private になっていないか(
Private Subは他のモジュールから呼べません) - そのマクロが別のブックにあるのではないか(別ブックのマクロは、そのままの名前では呼べません)
Excel の関数名をマクロ名のつもりで書いてしまうのも、意外に多い間違いです。VBA の中で Excel のワークシート関数を使うときは、Application.WorksheetFunction.Sum(...) のように前置きが必要で、Sum(...) だけでは「そんな Sub は無い」と怒られます。
原因5:宣言や命令を書いた「場所」が違う
VBA には、「Sub ~ End Sub の中にしか書けないもの」と「その外にしか書けないもの」があります。ここを取り違えると、書き方そのものは正しいのにコンパイルエラーになります。
| 出るメッセージ | 起きていること |
|---|---|
| プロシージャの外では無効です | 実行する命令(代入・MsgBox など)を Sub の外に書いている |
| End Sub、End Function または End Property 以降には、コメントのみが記述できます | End Sub の後ろに、コメント以外のコードが残っている |
| Type ブロック外では無効なステートメントです | Type ~ End Type の外側に、その中身だけが取り残されている |
コードの一部をコピーして貼り付けたときに、End Sub の後ろに落ちてしまったというのが典型です。次のような形になっていないか確かめてください。
Sub 集計する()
Cells(1, 1).Value = 100
End Sub
Cells(2, 1).Value = 200 ' ← End Sub の外に取り残された1行
Option Explicit と Dim(モジュール全体で使う変数)だけは、いちばん上の、Sub より前に書くのが正解です。
原因6:同じ名前を2回つくっている
名前がぶつかっているパターンです。出るメッセージは2種類あります。
- 「同じスコープ内で宣言が重複しています」=同じ範囲の中で、同じ名前を2回
Dimしている - 「あいまいな名前が検出されました」=同じモジュールの中に、同じ名前の
Subが2つある
Sub 集計する()
Dim n As Long
Dim n As Long ' ← 2回目の Dim。ここで止まる
End Sub
マクロの記録を何度も実行したあと、自動生成された Macro1 が2つ並んでいるというのもよくあります。Sub の一覧を上から見て、同じ名前が無いかを確かめてください。片方を消すか、名前を変えれば直ります。
ちなみに、Sub が違えば同じ変数名を使ってかまいません。「同じ範囲の中で2回」が条件です。
原因7:参照設定が切れている(「ユーザー定義型は定義されていません」)
他人から受け取ったブックや、別のパソコンで作られたブックで出やすいパターンです。Dim の型の名前が青く反転して、「ユーザー定義型は定義されていません」と出ます。
Dim dic As Scripting.Dictionary ' 参照設定が無いとここで止まる
Dim fso As Scripting.FileSystemObject
Scripting.Dictionary や Scripting.FileSystemObject のようにExcel の外にある部品を名前で直接指定する書き方は、VBE の[ツール]→[参照設定]でその部品にチェックが入っていることが前提です。チェックが外れている環境へファイルを持っていくと、そこで止まります。
直し方A:参照設定を入れ直す
[ツール]→[参照設定]を開き、「参照不可」と表示されている項目があれば、それが原因です。目的の部品(上の例なら Microsoft Scripting Runtime)にチェックを入れます。
直し方B:参照設定に頼らない書き方へ変える
配布するブックなら、そもそも参照設定を要らない形にしておくほうが安全です。
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
Object で受けて CreateObject で作れば、どの環境でも参照設定なしで動かせます。入力候補(ドット以降の一覧)が出なくなるのが引き換えですが、「相手の環境で止まらない」ほうが優先される場面は多いはずです。
「ByRef 引数の型が一致しません」は実行時エラー13とは別物
まぎらわしい名前なので、ここだけ切り出します。同じ「型が一致しません」という言葉でも、動く前に出るものと、動いている途中に出るものがあります。
動く前に「コンパイルエラー:ByRef 引数の型が一致しません」と出た場合は、マクロを呼ぶ側と受け取る側で、宣言している型が違うという話です。データの中身は関係ありません。
Sub 呼ぶ側()
Dim n As Integer
Call 受け取る側(n) ' ← Integer を渡している
End Sub
Sub 受け取る側(ByRef v As Long) ' ← Long で受けている
v = v + 1
End Sub
直し方は両方の型をそろえることです(上の例なら呼ぶ側も As Long にします)。ByRef(既定の渡し方)は変数そのものを貸し出す形なので、入れ物の種類が違うと VBA が受け付けません。
いっぽう、動いている途中に「実行時エラー ’13’: 型が一致しません」と番号付きで出た場合は、原因がまったく別で、セルの中身が犯人です。そちらは専用の記事に分けてあります。

二度とコンパイルエラーで止まらない3つの習慣
ここまでの7つを踏まえると、やることは3つに集約されます。
- モジュールの先頭に
Option Explicitを書く。原因1(スペルミス)が、実行前に自動で見つかるようになります。[ツール]→[オプション]→[編集]で「変数の宣言を強制する」にチェックを入れておけば、以後は自動です。 - 書いたら実行せず、まず[デバッグ]→[VBAProject のコンパイル]。文法の問題だけをまとめて先に潰せます。何も出なければ、文法は通っています。
- Tab キーでインデントを揃える。原因3(閉じ忘れ)は、縦の位置がそろっていない行として目に見えるようになります。
この3つは、慣れれば合計10秒もかかりません。それでいて、コンパイルエラーの大半は出る前に消えます。
よくある質問(Q&A)
Q. エラー番号が出ないので検索できません。どう調べればいいですか
A. ダイアログに出ている日本語の文章そのものが、検索語になります。「変数が定義されていません」「End If がありません」のように、メッセージをそのまま検索してください。コンパイルエラーには実行時エラーのような番号が付かないため、文章が番号の代わりになっています。
Q. 昨日まで動いていたのに、今日いきなりコンパイルエラーになりました
A. コード自体が変わっていないなら、環境の側が変わった可能性が高いです。とくに「ユーザー定義型は定義されていません」(原因7)は、別のパソコンで開いた・Office の構成が変わったときに出ます。[ツール]→[参照設定]で「参照不可」の項目が無いか確かめてください。
Q. [デバッグ]ボタンが出てきません
A. それがコンパイルエラーの特徴です。まだ1行も実行されていないので、止まった行という概念がありません。[OK]を押すと、問題の箇所が青く反転した状態で残ります。そこを見てください。
Q. 青く反転した行は正しく見えます。どこが悪いのでしょう
A. 原因がその少し前にあるパターンです。閉じ忘れ(原因3)だと、VBA は「閉じが来ないまま次の構造に入った場所」で気づくため、指摘される位置が実際の書き忘れよりも後ろになります。反転した行から上へ向かって、If・For・With の対応を確かめてください。
Q. Option Explicit を入れたら、エラーが大量に出てしまいました
A. 正常な反応です。宣言せずに使っていた変数が、すべて洗い出された状態です。1つずつ Dim を足していけば、そのぶんだけ将来のバグが消えます。数が多いときは、いちばん上のマクロから順に片づけてください。まとめて直さなくても大丈夫です。
まとめ:コンパイルエラーは「まだ何も起きていない」という合図
最後に要点だけ、もう一度並べます。
- 番号が出ず、青く反転したらコンパイルエラー。原因はデータではなくコードの書き方
- 最多はスペルミス。
Option Explicitで、実行前に自動で見つかる - 全角スペース・全角の記号は読めない。疑わしい行は消して半角で打ち直す
- 「End If がありません」系は、メッセージが答え。インデントを揃えれば目で見つかる
- 「Sub または Function が定義されていません」は名前と置き場所を確認
- 同じ名前を2回つくっていないか。記録したマクロが二重になっていないか
- 「ユーザー定義型は定義されていません」は参照設定。
Object+CreateObjectなら環境に左右されない - 書いたらまず[デバッグ]→[VBAProject のコンパイル]
コンパイルエラーは、初めて見るととても不親切に感じます。番号も出ず、青い反転だけが残るからです。けれど落ち着いて見てみると、これはVBA が実行前に立ち止まって「この書き方だと読めません」と教えてくれているだけのことです。データは1つも動いていません。やり直しは、いつでも効きます。
そして今日あなたが手に入れたのは、7つの原因だけではありません。「動く前のエラーは、必ず同じ場所で再現する」という事実です。再現するものは、必ず直せます。青い反転を1つずつ消していけば、必ず通ります。今日はここまでで十分です。
次に読む
番号付きの「実行時エラー」で止まったときは、番号ごとに原因がまったく違います。「実行時エラー13(型が一致しません)」はこちら。

「実行時エラー9(インデックスが有効範囲にありません)」はこちら。

「実行時エラー1004(アプリケーション定義またはオブジェクト定義のエラー)」はこちら。

そもそもマクロが起動しない・ボタンを押しても無反応というときは、こちら。

参考にした一次情報(2026年9月12日確認)
変数が定義されていません|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/variable-not-defined
Option Explicit ステートメント|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/option-explicit-statement
変数を宣言する|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/declaring-variables
構文エラー|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/syntax-error
無効な文字です|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/invalid-character
If ブロックに対応する End If がありません|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/block-if-without-end-if
For に対応する Next がありません|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/for-without-next
プロシージャの外では無効です|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/invalid-outside-procedure
同じスコープ内で宣言が重複しています|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/duplicate-declaration-in-current-scope
あいまいな名前が検出されました|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/ambiguous-name-detected
ユーザー定義型が定義されていません|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/how-to/user-defined-type-not-defined
End Sub、End Function または End Property 以降には、コメントのみが記述できます|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/only-comments-may-appear-after-end-sub-end-function-or-end-property
ByRef 引数の型が一致しません|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/byref-argument-type-mismatch


コメント