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

エラー表示

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

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

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

エラーの原因は主に下記の2つです。

  1. 不要な「End If」が記載されてしまっている

  2. If ブロック内にあるブロックが完成していない

1. 不要な「End If」が記載されてしまっている

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

Sub TestFunc1()
    Dim i as Long
    i = 0
    If 1 <> i Then
        Msgbox "i は 1 では、ありません。"
    End If
    End If  '← 不要な「End If」がある
End Sub

解消する方法

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

Sub TestFunc1()
    Dim i as Long
    i = 0
    If 1 <> i Then
        Msgbox "i は 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かチェックしないで違いがあります。

2. If ブロック内にあるブロックが完成していない

IF構文の中にあるブロックが完成していない(入力途中)のパターンです。
例えば、If構文の中にあるForブロックの『Next』がない、Do Whileブロックに対する『Loop』がない、Select Caseブロックの『End Select』がない等が該当します。
下記のエラーのサンプルプログラムでは、「For」に対する『Next』がありません。

Sub TestFunc2()
    Dim num As Long
    Dim i As Long
    num = 0
    i = 0
    If num = 0 Then
        For i = 1 To 5  '← Forに対する Next がない
            num = num + i
    End If  '← この End If がエラーの原因のように表示される
    MsgBox num
End Sub

解消する方法

対応するブロックを入力するか、不要なブロックを削除すれば解消します。
先のエラーでは「For」に対応する『Next』がなかったため、エラーが発生しました。
そのため、『Next』を追加してForブロックを完成させるか、「For」自体を削除すれば解消します。

例1:ブロックを完成させる

'『Next』を追加して、Forブロックを完成させる
Sub TestFunc2_1()
    Dim num As Long
    Dim i As Long
    num = 0
    i = 0
    If num = 0 Then
        For i = 1 To 5
            num = num + i
        Next i
    End If
    MsgBox num
End Sub

例2:不足しているブロックの始まり削除する

'「For」を削除して、Forブロックをなくす
Sub TestFunc2_2()
    Dim num As Long
    Dim i As Long
    num = 0
    i = 0
    If num = 0 Then
        num = num + i   ← For自体を削除した
    End If
    MsgBox num
End Sub

このエラーの予防策

  1. プログラムの削除やコメントアウトする場合は慎重に!
    プログラムの削除等をする場合、誤操作をしてしまわないよう慎重に操作しましょう。

  2. 長いプロシージャを作成しない!
    1つのプロシージャが長いと可読性を下げ、ケアレスミスを招きます。
    機能毎にプロシージャを区切って作成しましょう。
    一つの目安として、2画面分を超えたら分割を考えるべきでしょう。

    内部リンク:プロシージャの分割時に!
    【プロシージャの呼び出し】Sub・Function

関連リンク

ページの先頭へ