【VBAスタンダード対策】プロシージャを強制終了する「Exit Sub」の制御構造を攻略!
プログラムを実行中、エラーや特定の条件が発生した時点で、それ以降の処理をスキップしてプロシージャを終了させたい場合があります。その際に使用する Exit Sub の仕組みと、処理の流れる構造を正しく理解しましょう。
1. 問題:Exit Sub 実行時の処理の流れ
【 問題 】 下記のコードを実行して Main プロシージャを呼び出した際、メッセージボックスに表示される文字列はどれでしょうか?
Call CheckValue(10)
MsgBox "完了"
End Sub
Sub CheckValue(num As Integer)
If num > 5 Then
Exit Sub
End If
MsgBox "チェック通過"
End Sub
① 「チェック通過」が表示された後、「完了」が表示される
② 「完了」だけが表示される
③ 「チェック通過」だけが表示される
④ 何も表示されずにマクロ全体が終了する
2. 正解:Exit Sub の制御フローに関する正解
正解: ② 「完了」だけが表示される
3. 解説:呼び出し元へ処理を戻す構造
Exit Sub の最も重要な構造的特徴は、「マクロ全体を終了させるわけではなく、呼び出されたプロシージャだけを終了して、呼び出し元に制御を戻す」という点にあります。
Sub Main()
│ Call CheckValue(10) ───┐ 処理を移す
│ │
│ (戻ってきた!) ↓
│ MsgBox "完了" Sub CheckValue(num)
End Sub │ If 10 > 5 Then
│ Exit Sub ── 途中で脱出!
│ End If
│ MsgBox "チェック通過" (実行されない)
End Sub
1. ここが試験に出る!: スタンダード試験では、マクロ全体を終了させる End ステートメントと、そのプロシージャだけを抜ける Exit Sub の違いを突いてきます。今回のケースでは、CheckValue は途中で終了しますが、呼び出し元である Main の次の行(MsgBox "完了")に処理が戻る構造をしっかりと見極める必要があります。
2. エンジニアの視点: Java 17などの言語における `return;`(戻り値なしの即時復帰)と全く同じ構造です。実務において、不適切なデータ(事前条件の不一致)をプロシージャの最初でチェックして弾く手法を「ガード節(Guard Clause)」と呼びます。深くネスト(インデント)されたIf文を作らないための、理系NEOなスマートな設計パターンですね。
4. まとめ
「Exit Subは、その部屋(Sub)から出るだけで、元いた場所(Main)には戻る」。この構造を知っておけば、複雑なプロシージャ連携のデバッグも怖くありません。適切な脱出処理を組み込んで、無駄のない洗練された制御フローを構築しましょう。