ExcelマクロVBA入門
第61回.「On Error GoTo」と「Exit Sub」

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-07-12

第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は有効となります。



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

行ラベル
Label01:
これが、行ラベルです。
ラベル名:
と書きます。
GoToの行先として指定する場所になります。

Exit Sub

Subプロシージャーを抜けます。
つまり、Subプロシージャーが終了します。
上記のVBAコードの場合、Exit Subが無いと常にエラー時の処理が実行されてしまいます。
ここでは、エラー処理ルーチンの直前で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 がある場合はその時点でプロシージャーを抜けます。
※呼び出し元とは
  呼び出し元のさらに呼び出し元(親の親)も含めてになります。

エラー処理を理解することはとても重要です。
ステップ実行で、その動作を確認することが理解する一番の近道になるでしょう。

最後に

エラー処理はマクロVBAにおいて極めて重要です。
もちろん、エラー発生しないようにVBAを書くべきではありますが、
エクセルVBAでは、避けようのないエラー(でしか判定できないような場合)も存在します。
エラー処理を正しく行えるかどうかは、VBAスキルの判断になるとも言えます。
次回のOn Error Resume Nextと合わせてしっかりと習得してください。
第62回.「On Error Resume Next」とErrオブジェクト
「OnErrorResumeNext」ステートメントは、実行時エラーが発生してもマクロVBAを中断せずに、エラーが発生したステートメントの次のステートメントから実行を継続します。マクロVBAは、エラーが発生するとその時点で停止してしまいます。

実行時エラーに関する記事
実行時にトラップ可能なエラー番号一覧と対処
VBA実行時に発生するエラーのうち以下の表にあるエラーはトラップ(捕捉)できるエラーになります。OnErrorステートメントおよびErrオブジェクトのNumberロパティを使用してエラーへの対処を行うことができます。VBAでのエラーとは 上記の結果はイミディエイトウインドウに 13 型が一致しません。
よくあるVBA実行時エラーの解説と対応
VBAを書き終えて、いざ実行したら意味不明なメッセージが… ここでは初心者向けに、代表的な実行時エラーの解説とその対応について説明します。中級者以上の方は、実行時にトラップ可能なエラー番号一覧と対処 こちらを参考に、エラー対応(OnError等)を実装してください。



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

第58回.コレクションとは(Collection)
第59回.コレクション処理(For Each)
第60回.エラー処理(On Error)
第61回.「On Error GoTo」と「Exit Sub」
第62回.「On Error Resume Next」とErrオブジェクト
第63回.ブックを開く(Open)
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
第65回.シートの挿入、名前の変更(Add,Name)
第66回.シートのコピー・移動・削除(Copy,Move,Delete)
第67回.総合練習問題7
第68回.シートの保護、ブックの保護(Protect)


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

VBAコードの全プロシージャー・プロパィ一覧を取得|VBAサンプル集(10月12日)
VBAでエラー行番号を取得できるErl関数|VBA技術解説(10月12日)
手動計算時の注意点と再計算方法|ExcelマクロVBA技術解説(10月9日)
引数の数を可変にできるパラメーター配列(ParamArray)|VBA入門(10月7日)
VBEの使い方:デバッグ|ExcelマクロVBA入門(10月6日)
VBAにおける配列やコレクションの起点について|VBA技術解説(10月5日)
VBEの使い方:オブジェクト ブラウザー|VBA入門(10月5日)
VBEの使い方:ウォッチ ウィンドウ|VBA入門(10月4日)
VBEの使い方:ローカル ウィンドウ|VBA入門(10月3日)
VBEの使い方:イミディエイト ウィンドウ|VBA入門(10月2日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • 「On Error GoTo」と「Exit Sub」

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


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




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