PR
アフィリエイト広告を利用しています
アフィリエイト広告を利用しています

【動く前に止まる】VBAのコンパイルエラー7パターンと直し方|変数が定義されていません・構文エラー・End If がありません

VBAのコンパイルエラーの原因7パターンと直し方。エラー番号が出ずコードが青く反転するのは、マクロが動く前に止まっているサイン EXCEL VBA講座
スポンサーリンク

【この記事について】本記事は 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. 原因1:変数名のスペルミス(「変数が定義されていません」/最多)
    1. 直し方:青く反転した名前を、Dim の行と見比べる
    2. これを「二度とやらない」ための1行
  4. 原因2:全角スペース・全角記号が混ざっている(「無効な文字です」「構文エラー」)
    1. 直し方:怪しい行を消して、半角で打ち直す
  5. 原因3:If・For・Do・With の閉じ忘れ(「End If がありません」など)
    1. 閉じ忘れを見つけるコツ:インデントを揃える
  6. 原因4:Sub や Function の名前が違う/置き場所が違う
  7. 原因5:宣言や命令を書いた「場所」が違う
  8. 原因6:同じ名前を2回つくっている
  9. 原因7:参照設定が切れている(「ユーザー定義型は定義されていません」)
    1. 直し方A:参照設定を入れ直す
    2. 直し方B:参照設定に頼らない書き方へ変える
  10. 「ByRef 引数の型が一致しません」は実行時エラー13とは別物
  11. 二度とコンパイルエラーで止まらない3つの習慣
  12. よくある質問(Q&A)
    1. Q. エラー番号が出ないので検索できません。どう調べればいいですか
    2. Q. 昨日まで動いていたのに、今日いきなりコンパイルエラーになりました
    3. Q. [デバッグ]ボタンが出てきません
    4. Q. 青く反転した行は正しく見えます。どこが悪いのでしょう
    5. Q. Option Explicit を入れたら、エラーが大量に出てしまいました
  13. まとめ:コンパイルエラーは「まだ何も起きていない」という合図
    1. 次に読む
    2. 参考にした一次情報(2026年9月12日確認)

まず「動く前」か「動いている途中」かを見分ける(症状別 早見表)

エラーの直し方は、出たタイミングで真っ二つに分かれます。ここを間違えると、いくら調べても答えが出てきません。最初に次の表で自分の症状を確かめてください。

コンパイルエラー(この記事) 実行時エラー
出るタイミング マクロが動き出す前 動いている途中
エラー番号 番号が出ない(「コンパイルエラー」と文章だけ) 「実行時エラー ’13’:」のように番号が出る
止まった場所の色 青く反転する(選択された状態) [デバッグ]を押すと黄色く反転する
[デバッグ]ボタン 出ない([OK]と[ヘルプ]だけ) 出る
原因のありか コードの書き方 セルの中身・シート名・ファイルの状態
ファイルを変えると 何度やっても同じところで止まる ブックによって出たり出なかったりする

青く反転して番号が出ていなければ、この記事の内容です。そのまま読み進めてください。黄色く反転して番号が出ていた場合は、この記事の最後にある「次に読む」から番号ごとの記事へ進んでください。

そもそも「コンパイルエラー」とは何が起きているのか

VBA は、マクロを実行する直前にコードを1回ぜんぶ読み直して、文法として成立しているかを確かめます。この読み直しの作業をコンパイルと呼びます。人間でいえば、書き終えた文章を声に出す前に、いちど目で追って「文が途中で切れていないか」を確認するのに近い作業です。

ここで文法として読めない箇所が見つかると、1行も実行せずに止まります。これがコンパイルエラーです。裏を返せば、コンパイルエラーが出ている間、マクロはまだ何もしていません。データが壊れる心配はないので、その点は安心してください。

大事な性質が3つあります。

  • 止まる場所は毎回同じ。データやブックを変えても、直すまで同じところで止まります(=再現するので必ず直せます)。
  • 青く反転した箇所が、VBA が「読めなかった」と言っている場所。ただし原因はその少し前の行にあることも多いです(閉じ忘れが典型)。
  • 実行しなくても、先にまとめて見つけられる。VBE(Visual Basic Editor)のメニュー[デバッグ]→[VBAProject のコンパイル]を押すと、実行しないままチェックだけが走ります。

この最後の1つは、覚えておくと本当に楽になります。マクロを書いたら、実行の前にまず[VBAProject のコンパイル]。これだけで「実行してみたら動く前に怒られる」という遠回りが無くなります。

コンパイルエラーと実行時エラーの分かれ目の図。マクロを実行するとVBAがコード全体を読み直し、文法が読めなければ番号の出ないコンパイルエラーで1行も実行されず疑う場所はコードの書き方、読めれば実行が始まり動作中に止まると番号付きの実行時エラーで疑う場所はセルの中身やシート名
止まったタイミングが分かれば、疑う場所は半分に絞れます

原因1:変数名のスペルミス(「変数が定義されていません」/最多)

圧倒的に多いのがこれです。宣言した名前と、使っている名前が1文字違っています。

Option Explicit

Sub 集計する()
    Dim goukei As Long
    goukei = 0
    gokei = goukei + Cells(2, 1).Value   ' ← goukei ではなく gokei と書いている
End Sub

この場合、gokei が青く反転して「変数が定義されていません」と出ます。Microsoft の公式ドキュメントも、このメッセージは「宣言していない名前を使っている」ときに出るものと説明しています。よくあるのは次のような取り違えです。

  • goukeigokei(ローマ字のつづりが揺れる)
  • sheet1Sheet1(大文字小文字は VBA では区別されませんが、別の名前だと思い込んでいるケース)
  • DataDataa(打ち間違い)
  • コピーしてきたコードの変数名だけ書き換え忘れた

直し方:青く反転した名前を、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 キーで字下げを揃えると、閉じ忘れは目で見つかります。IfEnd IfForNext が同じ深さに並んでいるかを確かめてください。縦にそろっていない行が、そのまま犯人です。

なお、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 ExplicitDim(モジュール全体で使う変数)だけは、いちばん上の、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.DictionaryScripting.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’: 型が一致しません」と番号付きで出た場合は、原因がまったく別で、セルの中身が犯人です。そちらは専用の記事に分けてあります。

【型が合わない】VBA「実行時エラー13」の原因7つと直し方|型が一致しませんの正体はセルの中身
VBAの「実行時エラー13 型が一致しません」は、コードではなくセルの中身が原因で出ます。文字混じり・#N/Aエラー値・Application.Matchの戻り値・配列・オブジェクトなど原因7つを、[デバッグ]で止まった行から30秒で切り分ける手順で解説。IsNumeric/IsError/IsDateを使った再発しない書き方まで。

二度とコンパイルエラーで止まらない3つの習慣

ここまでの7つを踏まえると、やることは3つに集約されます。

  1. モジュールの先頭に Option Explicit を書く。原因1(スペルミス)が、実行前に自動で見つかるようになります。[ツール]→[オプション]→[編集]で「変数の宣言を強制する」にチェックを入れておけば、以後は自動です。
  2. 書いたら実行せず、まず[デバッグ]→[VBAProject のコンパイル]。文法の問題だけをまとめて先に潰せます。何も出なければ、文法は通っています。
  3. Tab キーでインデントを揃える。原因3(閉じ忘れ)は、縦の位置がそろっていない行として目に見えるようになります。

この3つは、慣れれば合計10秒もかかりません。それでいて、コンパイルエラーの大半は出る前に消えます。

よくある質問(Q&A)

Q. エラー番号が出ないので検索できません。どう調べればいいですか

A. ダイアログに出ている日本語の文章そのものが、検索語になります。「変数が定義されていません」「End If がありません」のように、メッセージをそのまま検索してください。コンパイルエラーには実行時エラーのような番号が付かないため、文章が番号の代わりになっています。

Q. 昨日まで動いていたのに、今日いきなりコンパイルエラーになりました

A. コード自体が変わっていないなら、環境の側が変わった可能性が高いです。とくに「ユーザー定義型は定義されていません」(原因7)は、別のパソコンで開いた・Office の構成が変わったときに出ます。[ツール]→[参照設定]で「参照不可」の項目が無いか確かめてください。

Q. [デバッグ]ボタンが出てきません

A. それがコンパイルエラーの特徴です。まだ1行も実行されていないので、止まった行という概念がありません。[OK]を押すと、問題の箇所が青く反転した状態で残ります。そこを見てください。

Q. 青く反転した行は正しく見えます。どこが悪いのでしょう

A. 原因がその少し前にあるパターンです。閉じ忘れ(原因3)だと、VBA は「閉じが来ないまま次の構造に入った場所」で気づくため、指摘される位置が実際の書き忘れよりも後ろになります。反転した行から上へ向かって、IfForWith の対応を確かめてください。

Q. Option Explicit を入れたら、エラーが大量に出てしまいました

A. 正常な反応です。宣言せずに使っていた変数が、すべて洗い出された状態です。1つずつ Dim を足していけば、そのぶんだけ将来のバグが消えます。数が多いときは、いちばん上のマクロから順に片づけてください。まとめて直さなくても大丈夫です。

まとめ:コンパイルエラーは「まだ何も起きていない」という合図

最後に要点だけ、もう一度並べます。

  • 番号が出ず、青く反転したらコンパイルエラー。原因はデータではなくコードの書き方
  • 最多はスペルミス。Option Explicit で、実行前に自動で見つかる
  • 全角スペース・全角の記号は読めない。疑わしい行は消して半角で打ち直す
  • 「End If がありません」系は、メッセージが答え。インデントを揃えれば目で見つかる
  • 「Sub または Function が定義されていません」は名前と置き場所を確認
  • 同じ名前を2回つくっていないか。記録したマクロが二重になっていないか
  • 「ユーザー定義型は定義されていません」は参照設定。ObjectCreateObject なら環境に左右されない
  • 書いたらまず[デバッグ]→[VBAProject のコンパイル]

コンパイルエラーは、初めて見るととても不親切に感じます。番号も出ず、青い反転だけが残るからです。けれど落ち着いて見てみると、これはVBA が実行前に立ち止まって「この書き方だと読めません」と教えてくれているだけのことです。データは1つも動いていません。やり直しは、いつでも効きます。

そして今日あなたが手に入れたのは、7つの原因だけではありません。「動く前のエラーは、必ず同じ場所で再現する」という事実です。再現するものは、必ず直せます。青い反転を1つずつ消していけば、必ず通ります。今日はここまでで十分です。

次に読む

番号付きの「実行時エラー」で止まったときは、番号ごとに原因がまったく違います。「実行時エラー13(型が一致しません)」はこちら。

【型が合わない】VBA「実行時エラー13」の原因7つと直し方|型が一致しませんの正体はセルの中身
VBAの「実行時エラー13 型が一致しません」は、コードではなくセルの中身が原因で出ます。文字混じり・#N/Aエラー値・Application.Matchの戻り値・配列・オブジェクトなど原因7つを、[デバッグ]で止まった行から30秒で切り分ける手順で解説。IsNumeric/IsError/IsDateを使った再発しない書き方まで。

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

【もう止まらない】VBA「実行時エラー9」の原因7つと直し方|インデックスが有効範囲にありません
VBAの「実行時エラー9:インデックスが有効範囲にありません」を、シート名・ブック名・配列・Split・コレクションの7原因に分けて解説。コピペで使える存在チェック関数つきで、今日中に直せます。

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

VBA「実行時エラー 1004」の原因7つと直し方|アプリケーション定義またはオブジェクト定義のエラー
VBAの「実行時エラー 1004(アプリケーション定義またはオブジェクト定義のエラー)」は、[デバッグ]で黄色く光る行を見れば原因が特定できます。シート名の指定ミス、閉じたブック、Range範囲、Select、保護、PasteSpecial、結合セルの7原因を、❌ダメな書き方→✅直した書き方のコピペ可VBAコード付きで解説します。

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

【動かない人へ】エクセルのマクロが実行できない原因7つと直し方|有効化・ブロック解除・xlsm保存
エクセルのマクロが実行できない原因は、ほとんど3つ。黄色いバーの「コンテンツの有効化」、赤いバー「セキュリティ リスク」のブロック解除、.xlsmでの保存です。症状別の早見表から、開発タブ・ボタン無反応・トラストセンター設定まで、7つの原因を手順つきで直します。

参考にした一次情報(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

コメント

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