こんにちは。
先日ExcelVBAを学習中の生徒様にこんなご質問をいただきました。
① If Tuki <> Month(Hiduke) Then Exit For
「練習問題の解答例↑のプロシージャを見たらIF文にEnd IFがないのにエラーにならずマクロを実行できます。
Elseが省略できるのは知っていましたが、End IFは必ず入れなければならないと思っていました。違うんですか?」
② If Hiduke = Date Then Myrange.Offset(, 2).Interior.Color = vbMagenta
「こちらのIF文も同じくEnd IFがないけれど問題なくマクロを実行できていました。
なのに、[Then]の位置で改行したらエラーが出るようになってしまって。何も変更していないのに、ただ改行しただけなのに、何故エラーになるんですか?」
VBAを学んでいると、「Ifを使ったら必ずEnd Ifで閉じなさい」と教わることが多く、例文ではたいてい[Then]や[Else]のところで改行されています。
しかし、実際に使われているコードを見ると、End If がどこにも見当たらないことがあります。
なぜ End If がなくてもエラーにならず実行できたり、今まで実行できていたものが途中で改行しただけでエラーになってしまったりするのでしょうか?
実はこんなルールがあります。
① 「1行形式」は End If を書かない!
VBAのIf文には、実は2つの書き方があります。
• 1行形式: If 条件 Then 処理 をすべて1行で書き切る方法
• ブロック形式: If から始めて、改行して処理を書き、End If で閉じる方法
ご質問のコードにある記述は、どちらも「1行形式」です。
VBAのルールでは、1行で書き切る場合に限り、End If を書かない(省略しなければならない)と決まっています。
1行で命令が終わっているため、VBAが自動的に「あ、ここでIf文は完結したな」と判断してくれるのです。
なので、例えElseがあったとしても、どんなに処理が複雑になっても、改行さえしなければ1行形式として成立するためEnd IFは不要となります。
② 「Then」の後で改行するとエラーになる理由
改行しただけで記述を変えたつもりはなくても、VBAにとっては「改行=ブロック形式(複数行)の始まり」という合図になります。
ブロック形式になった瞬間、VBAは「終わりの合図(End If)があるはずだ」と探しに行きます。
そこで End If が見当たらないと、「始まりはあるのに終わりがないよ!」とエラーを出してしまうのです。
改行したらEnd Ifは必須となります。
(注:行継続文字「 半角スペースと半角アンダースコア」を使用しての改行は1行と認識されます)
では他の構文(WithやSelect Case)の場合は?
「Ifが1行で済むなら、With や Select Case もEndを省略できるの?」
と思うかもしれませんが、残念ながらこれはIf文だけに許された「特別ルール」です。
• With 構文: 必ず End With が必要
• Select Case 構文: 必ず End Select が必要
• For 構文: 必ず Next が必要(例:For i = 1 To 31 に対して Next i)
これらの構文は、最初から複数の処理を囲むための「ブロック構造」として設計されているため、たとえ1行に詰め込んだとしても終わりの言葉を省略することはできません
【使い分けのコツ】
• 1行形式: Exit For のように、処理が1つだけで短くスッキリ見せたい時に最適。End Ifは不要。
• ブロック形式: 複数の処理をしたい時や、コードの読みやすさを重視する時に最適。End Ifが必須。
「なぜエラーになるのか?」という仕組みを理解すると、VBAの習得スピードは格段に上がります。
If分は特によく使われる構文ですので「Ifの1行ルール」で簡潔なコード記述を目指しましょう!
