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実行時エラーの解説と対応
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,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.ひらがな⇔カタカナの変換|エクセル基本操作



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

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


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



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