忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBAスタンダード対策】プロシージャを強制終了する「Exit Sub」の制御構造を攻略!

プログラムを実行中、エラーや特定の条件が発生した時点で、それ以降の処理をスキップしてプロシージャを終了させたい場合があります。その際に使用する Exit Sub の仕組みと、処理の流れる構造を正しく理解しましょう。

1. 問題:Exit Sub 実行時の処理の流れ

【 問題 】 下記のコードを実行して Main プロシージャを呼び出した際、メッセージボックスに表示される文字列はどれでしょうか?

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)には戻る」。この構造を知っておけば、複雑なプロシージャ連携のデバッグも怖くありません。適切な脱出処理を組み込んで、無駄のない洗練された制御フローを構築しましょう。


PR