VBA入門
「On Error GoTo」と「Exit Sub」

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013年5月以前 最終更新日:2021-09-21

第61回.「On Error GoTo」と「Exit Sub」


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


マクロVBAは、エラーが発生するとその時点で停止してしまいます。

マクろVBA on error Go To

VBAが実行不能となった場合には、エラー発生したVBAコードで停止します。
このようなエラー発生時にも、マクロVBAが停止せずに指定の行ラベルの位置に移動し処理を継続したい場合に、
On Error Go To ステートメントを使用します。


On Error GoTo 行ラベル

On Error GoTo 行ラベル
これが実行された後にエラーが発生すると、行ラベルの位置に制御が移ります。

このステートメント以降、

・On Error GoTo 0 を実行・・・ 同一プロシージャー内で記述されている場合のみ
・プロシージャーの終了

上記いずれかになるまでOn Errorは有効となります。
On Errorが実行された時点で、それ以前のエラー情報は消去さます。

Sub Sample
  On Error GoTo Label01
  '・・・
  'ここでエラー発生した場合はLabel01に移動
  '・・・
  On Error GoTo 0
  '・・・
  'ここでエラー発生した場合はVBA停止します
  '・・・
  Exit Sub
Label01:
  エラー時の処理
End Sub

行ラベル
Label01:
これが、行ラベルです。
ラベル名:
このようにラベル名の後ろに:(コロン)を付けて書きます。

GoToの行先として指定する場所になります。
ラベルの命名は通常の変数の命名規則に準じます。

行番号
On Error GoTo 行番号
行ラベルではなく、行番号(数字)を指定することもできますす。

On Error GoTo 10
'・・・
10:

このように数字の後ろに:(コロン)を付けて書きます。
行番号を使う事も出来ますが、現代においては使わない方が良いでしょう。


Exit Sub

Subプロシージャーを抜けます。
つまり、Subプロシージャーが終了します。

先に掲示したVBAコードの場合、Exit Subが無いと常にエラー時の処理が実行されてしまいます。
エラー処理ルーチンの直前でSubプロシージャーを抜けるためには、Exit Subを使用します。

Exit Sub の通常の使い方
If 終了条件 Then
  Exit Sub
End If

このように、ある条件の時に、
それ以降の処理をせずに、プロシージャーを抜ける為に使用します。


On Error の有効範囲とその動作について

以下のVBAコードを実際にステップイン実行(F8)して、その動作を確認してください。

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 がないので、エラー発生した時点でプロシージャーを抜けます。

上記のVBAでsample1を実行した結果は、
「Label02」→「Label01」の順でメッセージ表示されます。

On Error がないプロシージャーでのエラー時の動作
・呼び出し元が無い場合はエラー停止します。
・呼び出し元にOn Error が無い場合はエラー停止します。
・呼び出し元にOn Error がある場合はその時点でプロシージャーを抜けます。

※呼び出し元とは
  呼び出し元のさらに呼び出し元(親の親)も含まれます。


エラー処理を理解することはとても重要です。
ステップイン実行(F8) で、その動作を確認することが理解する一番の近道になるでしょう。
・実行、中断、リセット(停止) ・ステップ実行 ・呼び出し履歴 ・VBA実行途中で変数の状態を確認 ・Debug.Print ・Debug.Assert ・デバッグの最後に


最後に

エラー処理はマクロVBAにおいて極めて重要です。
もちろん、エラー発生しないようにVBAを書くべきではありますが、
エクセルVBAでは、避けようのないエラー(でしか判定できないような場合)も存在します。

エラー処理を正しく行えるかどうかは、VBAスキルの判断になるとも言えます。
次回のOn Error Resume Nextと合わせてしっかりと習得してください。

第60回.エラー処理(On Error)
・マクロVBAのエラー発生例 ・エラー処理のステートメント ・実行時エラー関連記事
第62回.「On Error Resume Next」とErrオブジェクト
・On Error Resume Next ・Errオブジェクト ・On Error Resume Next の使用例 ・「On Error Resume Next」の最後に
第134回.Errオブジェクトとユーザー定義エラー
・Errオブジェクト ・Errオブジェクトのエラー情報が解除されるのは ・Err.Raiseメソッド ・Errorステートメント ・Error関数 ・CVErr関数 ・エラー番号およびエラーメッセージ ・実行時エラー関連記事
実行時にトラップ可能なエラー番号一覧と対処
・マクロVBAでのエラーとは ・VBA実行時のエラー番号一覧 ・実行時にトラップ可能なエラー番号一覧の最後に
よくあるVBA実行時エラーの解説と対応
・データ型のエラー ・計算時のエラー ・インデックスのエラー ・オブジェクトの設定エラー ・メソッド・プロパティのエラー ・引数のエラー ・実行時エラー関連記事




同じテーマ「マクロVBA入門」の記事

第58回.コレクションとは(Collection)

・コレクションの中から単一オブジェクトを指定する場合 ・セルであるRangeオブジェクトのコレクションは? ・コレクションの要素数 ・Collectionオブジェクト
第59回.コレクション処理(For Each)
・For Each の構文 ・Exit For ・For Each の使用例 ・RangeオブジェクトのFor Each ・For Each サイト内の参考ページ
第60回.エラー処理(On Error)
・マクロVBAのエラー発生例 ・エラー処理のステートメント ・実行時エラー関連記事
第61回.「On Error GoTo」と「Exit Sub」
第62回.「On Error Resume Next」とErrオブジェクト
・On Error Resume Next ・Errオブジェクト ・On Error Resume Next の使用例 ・「On Error Resume Next」の最後に
第63回.ブックを開く(Open,Add)
・Workbooks.Openメソッド ・Openメソッドの使用例 ・Openメソッドの戻り値の使い方 ・Workbooks.Addメソッド ・Openメソッドの関連記事
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
・ブックを閉じる ・ブックを上書き保存 ・ブックに名前を付けて保存 ・ブックのコピーを保存 ・ブックを閉じる・保存の実践例
第65回.シートの挿入、名前の変更(Add,Name)
・シートの挿入 ・シートの名前変更 ・シート挿入、名前変更の実践例
第66回.シートのコピー・移動・削除(Copy,Move,Delete)
・シートのコピー・移動 ・シートの削除 ・シートのコピー・移動・削除の関連記事
第67回.総合練習問題7
・マクロVBA練習問題 ・シンキングタイム ・マクロVBA練習問題解答へ
第68回.シートの保護、ブックの保護(Protect)
・シートの保護 ・シートの保護解除 ・シート保護・解除の実践例 ・ブックの保護 ・ブックの保護解除 ・最後に


新着記事NEW ・・・新着記事一覧を見る

エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ