エラー内容
VBAコンパイル時に、「End If に対応する If ブロックがありません。」と表示される。
原因と解決方法
おもに次の2つの原因と解決方法が考えられます。
原因1. Ifに対してEnd Ifの方が多い
解説
If文の終わりをVBAに教えるのが、End Ifです。このEnd IfがIf文より数が多いとこのエラーが起こります。
実際のプログラムでは、次のような場面で起こりやすいです。
- 「Ifは1つなのに、End Ifを2回入力してしまった。」
- 「If文をコメントアウトしたのに、End Ifをコメントアウトし忘れた。」
POINT
コメントアウトは、コードの先頭に’を付けて、その行を実行しないようにすることです。
コメントアウトは、コードの先頭に’を付けて、その行を実行しないようにすることです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub ErrSample08_01() If Cells(1, 2).Value = "100" Then ' If Cells(1, 1).Value = "100" Then '← If文をコメントアウト MsgBox "100点です!" End If '← End Ifがそのまま End If End Sub |
解決方法
If文とEnd Ifがセットになるように、不要なEnd Ifはコメントアウト、または削除します。
今回の例は、If文をコメントアウトしているので、End Ifの部分もコメントアウトしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub ErrSample08_01() If Cells(1, 2).Value = "100" Then ' If Cells(1, 1).Value = "100" Then MsgBox "100点です!" ' End If '← End Ifもコメントアウト End If End Sub |
原因2. If文が1行なのにEnd Ifがある
解説
If文で条件と処理を1行で書いているのに、End If を書くとエラーとなります。
1 2 3 4 5 6 7 8 9 |
Sub ErrSample08_02() If Cells(1, 2).Value = "100" Then MsgBox "100点です!" '←1行のIf文 End If End Sub |
解決方法
条件と処理が1行のIf文では、End Ifは不要です。
そのため、End Ifを削除すればOKです。
1 2 3 4 5 6 7 8 9 |
Sub ErrSample08_02() If Cells(1, 2).Value = "100" Then MsgBox "100点です!" '←End Ifは削除 End Sub |
ただし個人的には、If文は条件と処理を、別の行に書いた方が見やすいと思っています。
なのでEnd Ifを削除するのではなく、下のプログラムのように、条件と処理を別の行にする修正もオススメです。
1 2 3 4 5 6 7 8 9 |
Sub ErrSample08_02() If Cells(1, 2).Value = "100" Then '← 条件と処理を別の行にする MsgBox "100点です!" End If End Sub |
POINT
このIf文が1行になっているエラー原因は、意外と気づくのに時間がかかります。
特にThenの後ろの処理が、Endなど短い命令だと特に見つけにくいので、注意深くさがしてください。
このIf文が1行になっているエラー原因は、意外と気づくのに時間がかかります。
特にThenの後ろの処理が、Endなど短い命令だと特に見つけにくいので、注意深くさがしてください。