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行でも必ず End If をつけた構文を使用する
ご存知の通り、If構文は1命令を同行に記載した場合(※) End If を省略することができます。
下記のマクロは正常に動きます。
Sub TestFunc() If 1 <> Range("A1") Then Range("B1") = "A1は1ではありません。" End Sub
ならば、最初からこの書き方をしなければよいという考え方です。
※下記は例外とします。
1." _"を使用した場合は次の行に命令文を記載可能
2.命令文後の":"を使用した場合は2命令以上を記載可能
-
長いプロシージャを作成しない
機能毎にプロシージャを区切って作成しましょう。
一つの目安として、2画面分を超えるプロシージャになったら分割を考えるべきと人から聞いたことがあります。