【VBA】マクロを途中で終了する Exit Sub と End の違いと使い分け

目次

はじめに

VBAでマクロを作成する際、特定の条件を満たした場合に、処理を途中で終了させたい場面がよくあります。例えば、「必要なファイルが見つからない」「入力必須のセルが空白である」といったケースです。

VBAには、処理を中断するためのステートメントとして、よく似た Exit SubEnd がありますが、この2つには明確な違いがあり、正しく使い分けないと意図しない結果を招くことがあります。

この記事では、Exit SubEnd のそれぞれの働きと、どのような場面でどちらを使うべきかを、分かりやすく解説します。


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セルが空白の場合、CheckPrerequisitesExit Sub で終了しますが、呼び出し元の MainProcess は中断されず、次の行(MsgBox "メイン処理を実行します。")の実行を試みます。


2. End: 全てのVBAプログラムを強制終了する

End ステートメントは、より強力で、実行中の全てのVBAプログラムをその場で完全に停止させます。どのプロシージャから呼び出されても、全ての処理が即座に終了します。

サンプルコード

先ほどのコードの Exit SubEnd に置き換えてみましょう。

' メインの処理
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 SubEnd
効果の範囲現在のプロシージャのみ全てのVBAプログラム
動作処理を中断し、呼び出し元に戻る処理をその場で完全に停止
主な用途・条件分岐での正常終了<br>・補助的な処理の中断・回復不能なエラー発生時<br>・プログラムの緊急停止

End は非常に強力な命令であり、オブジェクトのクリーンアップ処理などをスキップしてしまう可能性があるため、通常はあまり使用されません。 ほとんどの場合、Exit Sub(または Exit Function など)を使い、プロシージャごとに処理の流れを制御する方が、より安全で構造化されたプログラムになります。

致命的なエラーが発生し、プログラム全体をどうしても即座に停止させたい、という限定的な状況でのみ End を使用するようにしましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次