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

このようなエラー発生時にも、マクロVBAが停止せずに指定の行ラベルの位置に移動したい時に、
On Error Go To ステートメントを使用します。
On Error GoTo 行ラベル
これが実行された後にエラーが発生すると、行ラベルの位置に制御が移ります。
・On Error GoTo 0 を実行・・・ 同一プロシージャー内で記述されている場合のみ
・プロシージャーの終了
いずれかになるまでOn Errorは有効となります。
Sub Sample
On Error GoTo Label01
'・・・
'ここでエラー発生した場合はLabel01に移動
'・・・
On Error GoTo 0
'・・・
'ここでエラー発生した場合はVBA停止します
'・・・
Exit Sub
Label01:
エラー時の処理
End Sub
これが、行ラベルです。
ラベル名:
と書きます。
GoToの行先として指定する場所になります。
Exit Sub
つまり、Subプロシージャーが終了します。
上記のVBAコードの場合、Exit 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
sample03には、On Error がないので、エラー発生した時点でプロシージャーを抜けます。
上記のVBAでsample1を実行した結果は、
「Label02」→「Label01」の順でメッセージ表示されます。
・呼び出し元にOn Error が無い場合はエラー停止します。
・呼び出し元にOn Error がある場合はその時点でプロシージャーを抜けます。
※呼び出し元とは
呼び出し元のさらに呼び出し元(親の親)も含めてになります。
エラー処理を理解することはとても重要です。
ステップ実行で、その動作を確認することが理解する一番の近道になるでしょう。
最後に
もちろん、エラー発生しないようにVBAを書くべきではありますが、
エクセルVBAでは、避けようのないエラー(でしか判定できないような場合)も存在します。
エラー処理を正しく行えるかどうかは、VBAスキルの判断になるとも言えます。
次回のOn Error Resume Nextと合わせてしっかりと習得してください。
第62回.「On Error Resume Next」とErrオブジェクト
同じテーマ「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 ・・・新着記事一覧を見る
トランザクション処理|SQL入門(12月11日)
インデックスを作成して高速化(CREATE INDEX)|SQL入門(12月9日)
他のテーブルのデータで追加/更新/削除|SQL入門(12月8日)
データの削除(DELETE)|SQL入門(12月7日)
データの更新(UPDATE)|SQL入門(12月6日)
複数のSELECT結果を統合(UNION,UNION ALL)|SQL入門(12月5日)
テーブルを結合して取得(INNER JOIN,OUTER JOIN)|SQL入門(12月4日)
データベースの正規化とマスタの作成|SQL入門(12月3日)
データベースにおけるNULLの扱い方|SQL入門(12月2日)
オブジェクト変数とは何か|VBA技術解説(12月2日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。