はじめに
VBAでマクロを作成する際、特定の条件を満たした場合に、処理を途中で終了させたい場面がよくあります。例えば、「必要なファイルが見つからない」「入力必須のセルが空白である」といったケースです。
VBAには、処理を中断するためのステートメントとして、よく似た Exit Sub
と End
がありますが、この2つには明確な違いがあり、正しく使い分けないと意図しない結果を招くことがあります。
この記事では、Exit Sub
と End
のそれぞれの働きと、どのような場面でどちらを使うべきかを、分かりやすく解説します。
1. Exit Sub
: 現在のプロシージャだけを抜ける
Exit Sub
は、現在実行している Sub
プロシージャ(マクロ)だけを途中で抜け、呼び出し元のプロシージャ(もしあれば)に処理を戻します。
サンプルコード
この例では、メインの MainProcess
マクロが、補助的な CheckPrerequisites
マクロを呼び出します。CheckPrerequisites
の中で条件を満たさない場合、Exit Sub
で補助マクロだけを終了し、処理はメインマクロに戻ります。
' メインの処理
Sub MainProcess()
' 補助マクロを呼び出す
Call CheckPrerequisites
' CheckPrerequisitesが正常に終われば、この行が実行される
MsgBox "メイン処理を実行します。", vbInformation
End Sub
' 事前チェックを行う補助マクロ
Sub CheckPrerequisites()
' D2セルが空白の場合、このプロシージャだけを抜ける
If IsEmpty(Range("D2").Value) Then
MsgBox "D2セルに担当者名が入力されていないため、処理を中断します。", vbExclamation
Exit Sub
End If
' D2セルに値があれば、この行が実行される
Debug.Print "事前チェック完了。"
End Sub
解説: D2
セルが空白の場合、CheckPrerequisites
は Exit Sub
で終了しますが、呼び出し元の MainProcess
は中断されず、次の行(MsgBox "メイン処理を実行します。"
)の実行を試みます。
2. End
: 全てのVBAプログラムを強制終了する
End
ステートメントは、より強力で、実行中の全てのVBAプログラムをその場で完全に停止させます。どのプロシージャから呼び出されても、全ての処理が即座に終了します。
サンプルコード
先ほどのコードの Exit Sub
を End
に置き換えてみましょう。
' メインの処理
Sub MainProcessWithEnd()
' 補助マクロを呼び出す
Call CheckPrerequisitesWithEnd
' CheckPrerequisitesWithEndでEndが実行されると、この行は決して実行されない
MsgBox "メイン処理を実行します。", vbInformation
End Sub
' Endを使ってVBA全体を停止させる補助マクロ
Sub CheckPrerequisitesWithEnd()
If IsEmpty(Range("D2").Value) Then
MsgBox "致命的なエラー: 担当者名がありません。全ての処理を終了します。", vbCritical
End ' VBAの実行をここで完全に停止
End If
End Sub
解説: D2
セルが空白の場合、CheckPrerequisitesWithEnd
の中で End
が実行された瞬間に、VBAの全プログラムが停止します。そのため、呼び出し元の MainProcessWithEnd
に処理が戻ることはなく、MsgBox "メイン処理を実行します。"
が表示されることはありません。
使い分けのまとめ
項目 | Exit Sub | End |
効果の範囲 | 現在のプロシージャのみ | 全てのVBAプログラム |
動作 | 処理を中断し、呼び出し元に戻る | 処理をその場で完全に停止 |
主な用途 | ・条件分岐での正常終了<br>・補助的な処理の中断 | ・回復不能なエラー発生時<br>・プログラムの緊急停止 |
End
は非常に強力な命令であり、オブジェクトのクリーンアップ処理などをスキップしてしまう可能性があるため、通常はあまり使用されません。 ほとんどの場合、Exit Sub
(または Exit Function
など)を使い、プロシージャごとに処理の流れを制御する方が、より安全で構造化されたプログラムになります。
致命的なエラーが発生し、プログラム全体をどうしても即座に停止させたい、という限定的な状況でのみ End
を使用するようにしましょう。