Excel VBA | Exit Sub と Exit Function の基礎

VBA
スポンサーリンク

短く言うと:
Exit Sub はサブルーチン(Sub)をその場で終わらせるボタン、Exit Function は関数(Function)をその場で終わらせて呼び出し元に戻るボタンです。
「途中で処理をやめたい」場面で使いますが、使い方と注意点を例で丁寧に見ていきます。


1) 基本イメージ

  • Sub(戻り値なし)の途中で「もうこれ以上やらない」と決めたら Exit Sub を書くと、そこから先のコードは実行されずに呼び出し元に戻ります。
  • Function(戻り値あり)の途中で Exit Function を実行すると、それ以降のコードは実行されずに関数は終了します。終了時に関数名(または Return 相当の書き方で設定した値)が呼び出し元に返されます。

2) 単純な例:Exit Sub

Sub ExampleExitSub()
    Debug.Print "処理開始"
    If Range("A1").Value = "" Then
        Debug.Print "A1 が空なので処理を中止"
        Exit Sub   ' ここで Sub を途中終了して呼び出し元に戻る
    End If
    ' ↓ A1 が空でないときだけ実行される処理
    Debug.Print "A1 の値: " & Range("A1").Value
    Debug.Print "処理終了"
End Sub
VB

動き:A1 が空なら「A1 が空なので処理を中止」と表示され、以降のコードは実行されません。


3) 単純な例:Exit Function(戻り値あり)

Function GetDiscount(price As Double) As Double
    If price <= 0 Then
        GetDiscount = 0
        Exit Function  ' 異常値のときは即座に 0 を返して終了
    End If

    If price >= 1000 Then
        GetDiscount = price * 0.1  ' 10% 割引
        Exit Function
    End If

    GetDiscount = price * 0.05  ' 通常は 5% 割引
End Function
VB

動き:Exit Function が実行された地点で関数は終わり、GetDiscount に代入されている値が呼び出し元に返ります。Exit Function を書かずに最後まで到達しても GetDiscount に最後に代入した値が返ります。

補足:VBA の関数は「関数名 = 値」で戻り値を設定します(Return はありません)。Exit Function は「もう戻り値が決まったので終わる」という意味です。


4) ネスト(呼び出しチェーン)とスコープの注意

  • Exit Sub / Exit Function「そのプロシージャ(Sub/Function)だけ」 を終了します。
  • 呼び出し元(親プロシージャ)までは自動で抜けません。親も止めたい場合は、親側で戻り値や例外(エラー処理)を使って制御します。

例:

Sub Parent()
    Debug.Print "Parent start"
    Child()
    Debug.Print "Parent end"   ' Child が Exit してもここは実行される
End Sub

Sub Child()
    Debug.Print "Child start"
    Exit Sub
    Debug.Print "Child end"    ' 実行されない
End Sub
VB

5) Cleanup(後片付け)が必要な場面

ファイルを開く、オブジェクトを取得する、外部リソースを確保する処理では、Exit で途中終了すると 後片付け(Close / Release)を忘れがち です。
安全にするには、Exit 前に必ずクリーンアップを書くか、エラーハンドラ(On Error + ラベル)でまとめて行います。

Sub OpenFileExample()
    Dim fnum As Integer
    fnum = FreeFile
    Open "C:\temp\data.txt" For Input As #fnum
    If LOF(fnum) = 0 Then
        Close #fnum    ' Exit 前に閉じる
        Exit Sub
    End If

    ' ファイル処理...
    Close #fnum
End Sub
VB

より堅牢な書き方(エラーハンドラでまとめる):

Sub SafeOpenFile()
    Dim fnum As Integer
    On Error GoTo ErrHandler

    fnum = FreeFile
    Open "C:\temp\data.txt" For Input As #fnum

    ' ファイル処理...
    Close #fnum
    Exit Sub

ErrHandler:
    If fnum <> 0 Then
        On Error Resume Next
        Close #fnum
    End If
    Debug.Print "エラー発生: " & Err.Description
End Sub
VB

この形なら Exit Sub でも ErrHandler で後片付けできます(エラーのときだけでなく、途中退出の設計次第で同様に処理できます)。


6) Exit Function と戻り値の扱い(特に注意)

  • 関数の途中で Exit Function を使う場合、必ずその直前に戻り値をセットしておきましょう。そうしないと未定義のまま返す恐れがあります。
  • たとえば「条件を満たさなければ False を返して終わる」ようなガード節(先に検査して抜ける)を書くと可読性が上がります。
Function IsPrime(n As Long) As Boolean
    If n < 2 Then
        IsPrime = False
        Exit Function
    End If
    ' 簡易判定...
    IsPrime = True
End Function
VB

7) 実務っぽい例:在庫チェックで早期終了

課題:在庫表(A列品名、B列在庫数)を上から見て、在庫がマイナスの品が見つかったら「警告」を出して処理を中止する。

Sub CheckStock()
    Dim r As Long
    r = 2

    Do While Cells(r, 1).Value <> ""
        If Cells(r, 2).Value < 0 Then
            MsgBox "在庫がマイナスの品があります: " & Cells(r, 1).Value, vbExclamation
            Exit Sub   ' 問題があれば即中止(以降のデータはチェックしない)
        End If
        r = r + 1
    Loop

    MsgBox "在庫チェッ ク完了(問題なし)", vbInformation
End Sub
VB

ポイント:問題が見つかったらそれ以上行う意味がない → Exit Sub で素早く抜ける。ユーザーへ即フィードバック可能。


8) よくある誤解と注意点(まとめ)

  • Exit Sub / Exit Functionその場で終わる → 後続のコードは実行されない。
  • 外部リソースがあるときは 必ずクリーンアップ を行う(Exit の直前か、エラーハンドラにまとめる)。
  • ネスト(呼び出しチェーン)は自動で全部抜けない → 親も止めたいなら親側で判定する設計にする。
  • Exit Function を使うときは 戻り値を確実に設定してから抜ける。未設定だと想定外の値が返る。
  • 多用するとコードの流れが読みにくくなることがある → 適度にコメントを入れる。

9) 練習問題

短い演習で使い方を体で覚えましょう。

練習1:セル A1 が数値でない場合、メッセージを出してサブルーチンを止める Sub を作れ。
模範解答1

Sub Q1()
    If Not IsNumeric(Range("A1").Value) Then
        MsgBox "A1 に数値を入れてください"
        Exit Sub
    End If
    ' ここは数値のときだけ実行される
    Debug.Print "A1 = " & Range("A1").Value
End Sub
VB

練習2:引数 x が負なら -1 を返す関数 SignOrMinusOne を作れ(Exit Function を使う)。
模範解答2

Function SignOrMinusOne(x As Double) As Double
    If x < 0 Then
        SignOrMinusOne = -1
        Exit Function
    End If
    If x = 0 Then
        SignOrMinusOne = 0
    Else
        SignOrMinusOne = 1
    End If
End Function
VB

練習3(やや応用):ファイルを開いて読み込む処理を書く。ただしファイルが存在しない場合はメッセージを出して途中で終了し、ファイル番号は必ず閉じるようにせよ(ヒント:Dir で存在チェック)。
模範解答3

Sub Q3()
    Dim fname As String
    Dim fnum As Integer

    fname = "C:\temp\data.txt"
    If Dir(fname) = "" Then
        MsgBox "ファイルが見つかりません: " & fname
        Exit Sub
    End If

    fnum = FreeFile
    Open fname For Input As #fnum
    ' 読み込み処理...
    Close #fnum
End Sub
VB

10) 最後に — 実践的な使いどころ

  • 入力チェック(必要な値がなければ早期に終了)
  • 条件で流れを分けるガード節(先に異常系を潰す)
  • エラー条件や「ここでしか成り立たない処理」発生時の早期リターン

Exit Sub / Exit Function は「明快に早く終わる」ための強力なツールです。ですが、外部リソースの後片付けやネストした処理の意図は明確にしておきましょう。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました