VBAテクニック集 VBA一覧 デバッグ・エラー処理 実行時エラー

【VBA】Exit Subが終わらない場合とは|「処理を抜けたはずなのに止まらない」原因と設計

Excel VBAで処理制御を書いていると、
次のような 一見すると不可解な状況 に直面することがあります。

  • Exit Sub を書いたのに処理が止まらない
  • 条件を満たしたら抜けるはずなのに、後続処理が実行される
  • ループやイベントが止まらず、Excelがフリーズする
  • 「Exit Subを書けば安全」と思っていたのに挙動が違う
  • デバッグすると Exit Sub は通っているように見える

Exit Sub
「Subプロシージャを即座に終了させる命令」
として認識されているため、

Exit Sub = 強制終了
Exit Sub = それ以降は絶対に実行されない

と誤解されがちです。

しかし実務では、
Exit Subを書いても“終わらないように見える”ケース が確実に存在します。

この記事では、
Excel VBAにおける 「Exit Subが終わらない場合」 をテーマに、

  • Exit Subの正しい役割と動作範囲
  • 「終わらない」と感じる代表的なパターン
  • ループ・イベント・呼び出し構造との関係
  • よくある誤解とNG設計
  • 実務で再発させない制御構造の考え方

を、トラブル対応+設計理解の両面 から徹底解説します。

目次

✅ Exit Subとは何をする命令なのか

※まず前提を正確に整理します。

・Exit Subの基本的な役割

Exit Sub は、

「現在実行中の Sub プロシージャを即座に終了する」

ための命令です。

Sub Sample()
    MsgBox "開始"
    Exit Sub
    MsgBox "ここは実行されない"
End Sub

この場合、

  • 「開始」は表示される
  • Exit Sub以降のコードは実行されない

という、
非常にシンプルな挙動 をします。


・重要なポイント

Exit Subが終了させるのは、

「今いるSubプロシージャだけ」

です。

  • 呼び出し元のSub
  • 他のイベント
  • ループ全体

まとめて止める命令ではありません

ここを誤解していると、
「Exit Subが終わらない」という錯覚に陥ります。


✅ 「Exit Subが終わらない」と感じる典型的な症状

※実務でよくある誤解パターンです。

・よくある声

  • 「Exit Subを書いたのに処理が続く」
  • 「画面更新やイベントが止まらない」
  • 「別の処理が動き続けている」
  • 「Subは終わったのにExcelが固まる」

これらの多くは、

Exit Subが「正しく動いていない」のではなく
想定外の場所で“別の処理”が動いている

ことが原因です。


✅ 原因①:Exit Subは「呼び出し元の処理」までは止めない

※最も多い勘違いです。

・よくある構造

Sub MainProcess()
    Call SubA
    MsgBox "Mainの続き"
End Sub

Sub SubA()
    MsgBox "SubA開始"
    Exit Sub
    MsgBox "ここは実行されない"
End Sub

・実行結果

  • 「SubA開始」
  • 「Mainの続き」

が表示されます。


・なぜ「終わっていない」と感じるのか

開発者の期待:

Exit Subを書いたから、
MainProcessも止まるはず

実際の動作:

SubAだけが終了し、
呼び出し元(MainProcess)は続行される


・重要な理解

Exit Sub は、

  • SubAの中だけ を終了
  • MainProcessには影響しない

という仕様です。


・対策:戻り値やフラグで制御する

Sub MainProcess()
    If Not SubA() Then Exit Sub
    MsgBox "Mainの続き"
End Sub

Function SubA() As Boolean
    SubA = False
    Exit Function
End Function

「終了したい意図」を呼び出し元に伝える設計 が必要です。


✅ 原因②:ループの外側で処理が続いている

※Exit SubとExit Forの混同が原因です。

・誤解されやすいコード

Sub Sample()
    Dim i As Long

    For i = 1 To 10
        If i = 3 Then
            Exit Sub
        End If
    Next i

    MsgBox "ここまで来るはずがない?"
End Sub

・実際の挙動

このコードでは、
MsgBoxは 実行されません

ではなぜ「終わらない」と感じるのか?


・実務で多いケース

Sub Sample()
    Call LoopProcess
    MsgBox "後続処理"
End Sub

Sub LoopProcess()
    Dim i As Long
    For i = 1 To 10
        If i = 3 Then Exit Sub
    Next
End Sub

この場合、

  • LoopProcessは終了
  • Sampleの「後続処理」は実行

されます。


・対策




✅ 原因③:イベントプロシージャが再度発火している

※実務で非常に多い原因です。

・典型例:Worksheet_Change

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Value = "" Then
        Exit Sub
    End If

    Target.Value = UCase(Target.Value)
End Sub

・何が起きているか

  1. セル変更
  2. Worksheet_Change発火
  3. 値を書き換える
  4. 再びWorksheet_Changeが発火

Exit Subは 1回のイベント処理 を終わらせますが、
次のイベント発火までは止められません。


・結果

  • 処理が終わらない
  • 無限ループのように見える
  • Excelが固まる

・対策①:イベントを一時停止する

Application.EnableEvents = False
Target.Value = UCase(Target.Value)
Application.EnableEvents = True

・対策②:条件分岐を厳密にする

If Target.Value = UCase(Target.Value) Then Exit Sub

✅ 原因④:On Error Resume Next と組み合わせている

※Exit Subが“効いていないように見える”原因です。

・危険な組み合わせ

Sub Sample()
    On Error Resume Next

    If Range("A1").Value = "" Then Exit Sub

    Range("NoSheet").Value = 1
    MsgBox "処理続行"
End Sub

・何が問題か

  • Exit Subは正常に動作している
  • しかしエラーが無視され
  • 予期せぬ位置まで処理が進む

結果として、

「Exit Subを書いたのに、変な動きをする」

と感じやすくなります。


・対策


✅ 原因⑤:DoEvents や Wait による「止まらない感覚」

※処理制御の誤解です。

・よくある誤解

Do While True
    DoEvents
    If 条件 Then Exit Sub
Loop

・実際には

  • Exit SubはそのSubを終了
  • しかしExcel自体は生きている
  • 他のイベントが動き続ける

そのため、

「終わらない」「制御できていない」

と錯覚します。

参考:【VBA】処理が終わってから次の処理を実行する方法|DoEvents・待機・同期制御の基本と実例


✅ 原因⑥:Exit Subではなく Exit Function / Exit For が必要な場面

※命令の使い分けミスです。

・よくある誤解

  • Exit Sub → すべて止まる
  • Exit For → Subが終わる

これは 完全な誤解 です。


・正しい使い分け




✅ 「Exit Subが終わらない」を防ぐ設計の考え方

※ここが最重要ポイントです。

・① Subを小さく分ける

  • 1つのSubに多くを詰め込まない
  • 役割ごとに分離

・② フラグや戻り値で制御する

If Not IsContinue Then Exit Sub

・③ イベントと通常処理を混在させない

  • イベント内は最小処理
  • 重い処理は別Subへ

・④ 「Exit Subに期待しすぎない」

Exit Subは 万能な停止命令ではない
という認識が重要です。


✅ RPA(UiPath)連携時に特に注意すべき点

※実務では非常に重要です。

  • RPAはSubの終了=処理終了とは限らない
  • イベントが残っていると誤動作する
  • Application設定の復元漏れに注意
On Error GoTo Finally
Application.EnableEvents = False

' 処理

Finally:
Application.EnableEvents = True

✅ よくある勘違い

※トラブルの温床です。

・「Exit Subを書いたから安全」

→ 呼び出し元やイベントは止まりません。

・「Exit Subが壊れている」

→ 仕様通り動いています。


✅ まとめ:Exit Subが終わらないのではなく「止めたい範囲が違う」

  • Exit Subは“そのSubだけ”を終了する
  • 呼び出し元やイベントまでは止めない
  • ループ・イベントとの関係理解が必須
  • フラグ・戻り値での制御が重要
  • 設計段階で「止め方」を考える

「Exit Subが終わらない」と感じたときは、
VBAが間違っているのではなく、

自分が「どこまで止めたいか」を
Exit Subに期待しすぎている

ケースがほとんどです。

Exit Subの正しい役割を理解し、
制御構造を整理することで、

  • フリーズ
  • 無限ループ
  • 意図しない後続処理

は確実に防げます。

ぜひこの記事を、
「処理制御で迷ったときの基準書」 として活用し、
安定したExcel VBA設計を身につけてください。

参考:【VBA】処理が終わるまで待機させる【Sleep関数・Application.Waitメソッド】

    -VBAテクニック集, VBA一覧, デバッグ・エラー処理, 実行時エラー