第61回.「On Error GoTo」と「Exit Sub」
「On Error GoTo 行ラベル」
このステートメントは、実行時エラーが発生した時に制御を指定の行ラベルに移動させるものです。

このようなエラー発生時にも、マクロVBAが停止せずに指定の行ラベルの位置に移動し処理を継続したい場合に、
On Error Go To ステートメントを使用します。
On Error GoTo 行ラベル
これが実行された後にエラーが発生すると、行ラベルの位置に制御が移ります。
・プロシージャーの終了
On Errorが実行された時点で、それ以前のエラー情報は消去さます。
Sub Sample
On Error GoTo Label01
'・・・
'ここでエラー発生した場合はLabel01に移動
'・・・
On Error GoTo 0
'・・・
'ここでエラー発生した場合はVBA停止します
'・・・
Exit Sub
Label01:
エラー時の処理
End Sub
行ラベル
これが、行ラベルです。
ラベル名:
このようにラベル名の後ろに:(コロン)を付けて書きます。
ラベルの命名は通常の変数の命名規則に準じます。
行ラベルではなく、行番号(数字)を指定することもできますす。
On Error GoTo 10
'・・・
10:
このように数字の後ろに:(コロン)を付けて書きます。
行番号を使う事も出来ますが、現代においては使わない方が良いでしょう。
Exit Sub
つまり、Subプロシージャーが終了します。
エラー処理ルーチンの直前でSubプロシージャーを抜けるためには、Exit Subを使用します。
If 終了条件 Then
Exit Sub
End If
このように、ある条件の時に、
それ以降の処理をせずに、プロシージャーを抜ける為に使用します。
On Error の有効範囲とその動作について
Sub sample1()
On Error GoTo Label01
Call sample2
Call sample3
Exit Sub
Label01:
MsgBox "Label01"
End Sub
Sub sample2()
On Error GoTo Label02
Dim i As Long
i = "abc"
On Error GoTo 0
Exit Sub
Label02:
MsgBox "Label02"
End Sub
Sub sample3()
Dim i As Long
i = "abc"
Exit Sub
Label03:
MsgBox "Label03"
End Sub
sample02には、On Error GoTo Label02、があるのでエラー発生時はLabel02に移ります。
sample03には、On Error がないので、エラー発生した時点でプロシージャーを抜けます。
「Label02」→「Label01」の順でメッセージ表示されます。
・呼び出し元にOn Error が無い場合はエラー停止します。
・呼び出し元にOn Error がある場合はその時点でプロシージャーを抜けます。
呼び出し元のさらに呼び出し元(親の親)も含まれます。
エラー処理を理解することはとても重要です。
ステップイン実行(F8) で、その動作を確認することが理解する一番の近道になるでしょう。
最後に
もちろん、エラー発生しないようにVBAを書くべきではありますが、
エクセルVBAでは、避けようのないエラー(でしか判定できないような場合)も存在します。
次回のOn Error Resume Nextと合わせてしっかりと習得してください。
同じテーマ「マクロVBA入門」の記事
第58回.コレクションとは(Collection)
第59回.コレクション処理(For Each)
第60回.エラー処理(On Error)
第61回.「On Error GoTo」と「Exit Sub」
第62回.「On Error Resume Next」とErrオブジェクト
第63回.ブックを開く(Open,Add)
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
第65回.シートの挿入、名前の変更(Add,Name)
第66回.シートのコピー・移動・削除(Copy,Move,Delete)
第67回.総合練習問題7
第68回.シートの保護、ブックの保護(Protect)
新着記事NEW ・・・新着記事一覧を見る
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
