End If に対応する If ブロックがありません。

エラー表示

このエラーが発生すると、マクロ起動時(コンパイル時)に次のエラーが表示されます。
コンパイル エラー:

End If に対応する If ブロックがありません。

エラーの発生理由について

エラーの原因は If構文の最後に "End If" が余分に書かれていることです。
下記はエラーのサンプルプログラムです。

Sub TestFunc1()
    If 1 <> Range("A1") Then
        Range("B1") = "A1は1ではありません。"
    End If
    End If
End Sub

解決方法は?

"End If"を削除すれば、解消されます。

Sub TestFunc1()
    If 1 <> Range("A1") Then
        Range("B1") = "A1は1ではありません。"
    End If
End Sub

注意点

If文が入れ子の時に、特に注意して欲しいのですが、本来必要なIf文を削除やコメントアウトをしてしまっていないかを確認してから"End If"を削除してください。

Sub TestFunc2()
    If 1 <> Range("A1") Then
        'If 1 <> Range("B1") Then   '←誤ってコメントアウト
            Range("C1") = "A1およびB1は1ではありません。"
        End If  
    End If  '・・・①
End Sub

上記プログラムは『A1とB1が1ではない場合、C1に文字列を入力するマクロ』です。実行しようとすると①の行でエラーが発生してしまい、実行できません。
この時に、①の"End If"を削除してしまうと、想定する動きと異なる処理をしてしまいます。

  • 想定の処理・・・A1とB1が1ではない場合、C1に文字列を入力
  • 実際の処理・・・A1が1ではない場合、C1に文字列を入力

ほぼ同じように見えますが、B1が1かチェックしないで違いがあります。

このエラーの予防策

  1. If文をコメントアウト(削除)する場合、必ず"End If"もコメントアウト(削除)するよう心がける
    機能毎にプロシージャを区切って作成しましょう。
    一つの目安として、2画面分を超えるプロシージャになったら分割を考えるべきと人から聞いたことがあります。
  2. 長いプロシージャを作成しない
    機能毎にプロシージャを区切って作成しましょう。
    一つの目安として、2画面分を超えるプロシージャになったら分割を考えるべきと人から聞いたことがあります。

関連リンク

ページの先頭へ