【On Error GoTo】基本のエラー処理を詳しく解説「On Error GoTo 0」
ExcelのVBA「On Error GoTo」と「On Error GoTo 0」の使い方を解説します。
補足事項として、「Err」に関するプロパティとメソッドも解説していきます。
「On Error」ステートメントは、VBAでエラー処理する方法の基本になります。
ぜひ覚えてください。
VBAのエラー処理で「On Error GoTo」と「On Error GoTo 0」を
使ったサンプルコードの紹介もします。
合わせて、サンプルコードの解説もします。
「On Error GoTo」等のエラー処理を解除する「On Error GoTo 0」についても解説しています。
VBAで「On Error GoTo」を使う場合は
「On Error GoTo 0」を使うことは必須ですので、必ずセットで覚えてください
「On Error」応用編として、VBAのエラー発生を無視して次の行の処理を実行してくれる「On Error Resume Next」について解説した記事はこちらになります。
せっかくマクロを作ったのにVBAでエラーが出るのって嫌な気持ちになってしまいますよね。
VBAのエラー発生時の対策をあらかじめしておけば、エラー発生ウィンドウが表示されずに
処理してくれます。
そこで使うのが「On Error GoTo」です。
「On Error GoTo」はVBAでエラー処理をする時に使います。
VBAの「On Error GoTo」を使うと、VBAでエラーが起こった時に
エクセルでエラー発生ウィンドウを表示させずに、VBA内で条件分岐等をする事が可能です。
VBAでエラー処理が可能ということは、条件分岐先で「Exit Sub」があれば、エラー発生した場合に
勝手にマクロを終了してくれます。
なので「On Error GoTo」と「Exit Sub」を組み合わせれば、VBA実行の途中終了も可能です。
On Error GoToを使ったサンプルコードを掲載します。
ですが、みなさんが思ってる使い方と地味に違ったりする箇所もあるので
注意事項にも、さらっと目を通しておくことをオススメします。
では、ExcelのVBA「On Error GoTo」を使用して、エラー処理ができる 方法と
「On Error GoTo」使い方を解説します。
< ---目次--- >
◆「On Error GoTo」とは?
「On Error GoTo」とは、マクロ実行中にVBAエラーが発生した時に
指定したラベルに行ジャンプしてくれるコードです。
VBAでのエラー処理には、「On Error GoTo」は必須です。
「On Error Resume Next」を使用すれば
VBAのエラー発生を無視して次の行の処理を続行します。
「On Error GoTo ラベル」を使用した場合は、次のような挙動になります。
・VBAの実行が一時停止しない
エラー処理したい箇所の前に「On Error GoTo ラベル」を記載します。
そうした時に、エラーが発生した場合は
VBAの処理を停止させずに、指定した行ラベルにジャンプして処理を続けます。
・エラー発生ウィンドウが表示されない
通常、VBAでエラーが発生した場合は
「エラーNo」や「エラー内容」が記載されているエラーウィンドウが表示されますが
「On Error GoTo ラベル」を記述した次の処理からは、表示されません。
◆VBA「On Error GoTo」の使い方とサンプルコード
●エラー処理サンプルコード
Sub エラー発生サンプル()
Dim Ws As Worksheet
Dim Rng As Range
Label1:
'●エラー発生時に「Label100」にジャンプ
On Error GoTo Label100
Set Rng = Ws.[A1] '「Ws」にオブジェクトを定義していないとエラー発生
'●通常通り、エラー発生時にエラー発生ウィンドウを表示
On Error GoTo 0
Exit Sub
Label100:
Debug.Print "エラーNo. :" & vbTab & Err.Number
Debug.Print "エラー内容:" & vbTab & Err.Description
Resume ErrRecovery1 'Resume ラベルで「On Error GoTo」がまた使える
ErrRecovery1:
'Exit Sub 'このモジュールを終了
Set Ws = Sheets(1)
GoTo Label1
End Sub
●「On Error GoTo」の使い方
・エラー発生時に指定ラベルにジャンプ
VBAでは、「On Error GoTo」の後に「ラベル(変数)」を記述するだけで
VBAがエラー発生した時に、そのラベルにジャンプして条件分岐してくれます。
今回のVBAエラー処理サンプルコードでは
条件分岐後に「エラーNo.」と「エラー内容」をイミディエイトウィンドウに出力してから
プログラムの先頭の「Label1:」に処理を戻しています。
当然、エラーが発生しても、エラーウィンドウは表示されません。
・ラベルの記述方法
「ラベル」の記述方法は
「ラベル名:」です。変数の後にコロン”:”を入力します。
「セミコロン」ではなく「コロン」なので、間違えないでくださいね。
ラベル名は変数と被らなければなんでもOKです。
ラベルを入力した後は、「On Error GoTo 」や通常の「Go To」文の後に
指定したラベル名を入力すれば、使えます。
・「On Error GoTo 0」の意味は?
VBAの「On Error GoTo 0」の意味は、エラー処理を通常通りに戻すことです。
通常通りとは、エラーが発生すれば、エクセルでエラー発生ウィンドウを表示させることです。
なので、エラー無視したい区間の終わりに、必ず、「On Error GoTo 0」を使用してください。
「On Error GoTo 0」を入れ忘れると、違う予期せぬエラーが起こっていても対処できません。
特に初心者の方は、「On Error GoTo 0」を使用することを忘れないでください。
「On Error GoTo 0」の「0」の部分は、エラー処理する時は、ラベルを指定していましたよね。
それを「0」と指定することで、リセットを表しています。
「False」も「0」なので「False」みたいな感じですね。
・「Exit Sub」の意味は?
VBAで「Exit Sub」の意味は、モジュールの途中終了になります。
なので、「Exit Sub」の使い方は、マクロを途中終了させたい時に使えば良いのです。
「On Error GoTo」でエラー処理して、条件分岐先で「Exit Sub」があれば、エラー発生した場合に
勝手にマクロを終了してくれます。
VBAでのエラー処理として
エラー発生時の途中終了する方法としては
「On Error GoTo」と「Exit Sub」を組み合わせる事です。
ですが、VBAを勝手に途中終了すると、なんのエラーが起こったのか不明な状態で終わります。
'・
'・
Debug.Print "エラーNo. :" & vbTab & Err.Number
Debug.Print "エラー内容:" & vbTab & Err.Description
'・
'・
サンプルコードでは、「Debug.Print」を使用して上記のようなコードを使用することによって
イミディエイトウィンドウにエラーの内容を出力しています。
●「On Error GoTo」の有効範囲
VBAの「On Error GoTo」の有効範囲は、「On Error GoTo ラベル」を記述したの次の行から
「On Error GoTo 0」と記述するまでになります。
エラー処理を解除する「On Error GoTo 0」が無い場合は
「On Error GoTo ラベル」を記述したプロシージャが終了するまでとなります。
◆サンプルコードを詳しく解説
'・
'・
Resume ErrRecovery1 'Resume ラベルで「On Error GoTo」がまた使える
ErrRecovery1:
'・
'・
しっかりコード読み取っている方は、「Resume ラベル」と記述されているこの部分はなぜ必要なのか、疑問に思う方が多いと思います。
マクロ実行中に1回のみのエラー分岐処理であれば、必要はありません。
ですが、「On Error GoTo」を2回以上使う場合は、「Resume ラベル」が必須になります。
「On Error GoTo」は、1回目はエラー分岐処理にて「Label100」に条件分岐して、もちろんジャンプしてくれます。
ですが、「On Error GoTo」の2回目以降は「Resume ラベル」がないと、エラーウィンドウが表示されます。
うーん。謎仕様。
・・・ですが、受け入れるしかありません。
「On Error GoTo」を複数回使う場合は、「Resume ラベル」が必要になります。
◆VBA【On Error GoTo】の注意事項
・「On Error GoTo」のエラー処理の使用終了宣言をする
「On Error GoTo」による条件分岐したい処理区間が終わったのに条件分岐終了宣言をしていないと
違う箇所でエラー発生しても、「On Error GoTo」による条件分岐が発生してしまいますので
ループや予期せぬ挙動になりかねないので気を付けましょう。
必ず、「On Error GoTo 0」と記述して、エラーによる条件分岐終了宣言しましょう。
VBAのループによる、エクセル「応答なし」の対策をしたい方は、こちらの記事がおすすめです。
・「On Error GoTo」を複数回使う場合
途中にも記載しましたが、「On Error GoTo」を1回のみ使い場合は、特に注意事項はありませんが
「On Error GoTo」を1回使用時と、2回以上使用する時で、記述方法が変わると面倒なので
VBAで「On Error GoTo」を使う場合は、「Resume ラベル」をセットで使用する事をオススメします。
詳細は、こちらをご覧ください。
◆「Err」に関するプロパティとメソッド
ExcelのVBA「On Error GoTo」ステートメントの関係するもので
エラー発生時専用の「Err」オブジェクトがあります。
「Err」オブジェクトは、おもに、VBA実行時のエラー発生に関する情報を保持しています。
「Err」に関するプロパティとメソッドは下記に開設します。
・Err.Number
「Err.Number」とは、エラー発生の番号です。
エラーに番号があると管理や検索もしやすいので、エラー番号があります。
エラーが発生してない時、「Err.Number」は、「0」です。
下記画像のウィンドウの
「’91’」の部分が
「Err.Number」です。
・Err.Description
「Err.Description」とは、発生したエラー内容の簡易的な説明です。
下記画像のウィンドウの
「オブジェクト変数または With ブロック変数が設定されていません。」の部分が
「Err.Description」です。
・Err.HelpContext
「Err.HelpContext」とは、VBAのヘルプファイルのトピックに対応するコンテキスト数値です。
・Err.HelpFile
「Err.HelpFile」とは、VBAのヘルプファイルへの絶対パスが格納されています。
・Err.LastDllError
「Err.LastDllError」とは、一番最後にDLL(ダイナミックリンクライブラリ)を
呼び出しをした時のエラーコードが格納されています。
・Err.Source
「Err.Source」とは、エラー発生元のオブジェクト、又は、アプリケーションの名前が格納されています。
ほぼ、「VBAProject」だと思います。
・Err.Clear
「Err.Clear」は、「Err」に関するすべてのプロパティの値を消去します。
「クリア」そのままの意味ですね。
◆まとめ
VBA「On Error GoTo」の使い方をサンプルコードを元に詳しく解説しました。
通常では知ることのできない内容もあったと思います。
注意事項を必ず読んで頂いて、エクセルVBAで「On Error GoTo」を使うことをオススメします。
不明点等あれば、ぜひコメントよろしくお願いします。