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

エラー表示

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

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

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

エラーの原因は If構文の最後に "End If" を書き忘れてしまっているためです。
下記はエラーのサンプルプログラムです。

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

解決方法は?

If構文の最後の行に"End If"を入力すれば、このエラーは解消されます。エラーが発生した時、下記の画像のように"End Sub"の文字色が選択された状態になりますが、"End If"を付け忘れている箇所を探しましょう。
本エラーが発生したときの
関数(プロシージャ)内全ての If構文に End IF があるかを確認する必要があります。先のサンプルを直すとすると、次の通りになります。

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

このエラーの予防策

  1. インデントを行う
    インデントとは字下げのことです。
    プログラム全般に言えることですが、字下げをするのと、しないのでは可読性(プログラムの読みやすさ)が大きく変わります。
  2. 1行でも必ず End If をつけた構文を使用する
    ご存知の通り、If構文は1命令を同行に記載した場合(※) End If を省略することができます。
    下記のマクロは正常に動きます。
    Sub TestFunc()
        If 1 <> Range("A1") Then Range("B1") = "A1は1ではありません。"
    End Sub
    
    
    ですが、この書き方をしてしまうとIf構文で End If が必要だったり、書かなくても良かったりでパッと見で分かりにくくなってしまいます(可読性の低下)。
    ならば、最初からこの書き方をしなければよいという考え方です。
    ※下記は例外とします。
     1." _"を使用した場合は次の行に命令文を記載可能
     2.命令文後の":"を使用した場合は2命令以上を記載可能
  3. 長いプロシージャを作成しない
    機能毎にプロシージャを区切って作成しましょう。
    一つの目安として、2画面分を超えるプロシージャになったら分割を考えるべきと人から聞いたことがあります。

関連リンク

ページの先頭へ