短く言うと: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
VB5) 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
VB7) 実務っぽい例:在庫チェックで早期終了
課題:在庫表(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
VB10) 最後に — 実践的な使いどころ
- 入力チェック(必要な値がなければ早期に終了)
- 条件で流れを分けるガード節(先に異常系を潰す)
- エラー条件や「ここでしか成り立たない処理」発生時の早期リターン
Exit Sub / Exit Function は「明快に早く終わる」ための強力なツールです。ですが、外部リソースの後片付けやネストした処理の意図は明確にしておきましょう。


