非表示にできる< 目次 >
本記事の信頼性
Nakamura(@nkmr_dai)
本記事で分かること
本記事では、以下のことが分かります。
ポイント
エラー回避とは?
プログラムを作成するとどうしてもエラーが発生します。
理由は様々ですが、
「VBA作成者のPC環境と利用者のPC環境が相違しているケース」や
「OSやEXCEL自体のバージョン更新されたケース」が
主な理由だと思います。
本来であれば、様々なユースケースを想定してプログラムを構築していく必要があるのですが、
時間が無い時やコーディングを始めて初めの頃はそうもいきません。
そのような場合、エラー回避をする構文を利用すると
エラーを検知した時にスキップしたり、エラー時の動作を設定出来たりが出来ます。
エラー回避する構文は2つあります。
エラー回避構文-2つ-
②On Error GoTo
On Error Resume Next でエラー回避
On Error Resume Nextはどんなエラーが発生してもスキップするとても危険なコードです。
本来は修正すべきコードでさえも無視して処理を再開していきます。
エラー理由が分かっている場合にのみ使用しましょう。
注意ポイント
Sub ~ End Subすべての範囲でエラーがスキップされます
※解除方法は同ページの「エラールーチンを解除する方法」を参照ください。
<ソースコード>
1 2 3 4 5 6 |
Sub Macro1() 'エラースキップ On Error Resume Next ‘ ここに処理をしたいコードを記載 End Sub |
On Error GoTo エラー時の動作 でエラー回避
On Error GoTo は、エラー時に 指定の動作を作動させる エラー構文です。
例えば、エラー発生時にMsgboxで
「エラー発生。VBA作成者に連絡して下さい。」と表示させてからVBAを終了させることができます。
尚、「エラー時の動作」はExit Sub~End Subの間に記載するルールがあるため、ご注意ください。
(On Error GoTo でとんだエラー時の動作後は、End Subへ行き VBAが終了します。)
この辺は分かりにくいと思いますので、↓の方に図解でも説明していますのでご覧になって下さい。
<ソースコード>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub Macro1() 'エラー検知時Err1を動作させる On Error GoTo Err1 ‘ここに処理をしたいコードを記載 'Err1はExit Sub~End Subの間で記載する必要があるため、ExitSubを記載。 Exit Sub 'エラー時の動作。そのままEndSubへとびVBAが終了します。 Err1: MsgBox "エラー発生。終了" End Sub |
On Error GoTo - 処理を再開させる方法
On Error GoTo でとんだエラー時の動作後は、
基本的には End Subへ行き VBAが終了します。
しかし、
「エラー検知したコードを再実行したい場合」や、
「エラー検知した次のコードから再開したい場合」があります。
その場合は、
Resume もしくは Resume Next を利用すれば解決できます。
On Error GoTo - エラー検知したコードを再実行したい場合 (Resumeを使用)
エラー検知したコードを再実行したい場合、Resume を使用します。
ResumeにNextを使用しないことで「次へ」が欠落し、
エラーしたコードをひたすらResume(~処理再開)を繰り返します。
<コーディングのイメージ>
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Macro1() 'エラー検知時Err1を動作させる On Error GoTo Err1 ‘ここに処理をしたいコードを記載 Exit Sub Err1: MsgBox "エラー発生" Resume 'エラーしたコードを再実行させます。 End Sub |
On Error GoTo - エラー検知した次のコードから再開したい場合(Resume Nextを使用)
エラー検知した次のコードから再開したい場合、Resume Next を使用します。
Resume Next により「次のコードから再開」という意味となります。
<コーディングのイメージ>
1 2 3 4 5 6 7 8 9 10 |
Sub Macro1() 'エラー検知時Err1を動作させる On Error GoTo Err1 ‘ここに処理をしたいコードを記載 Exit Sub Err1: MsgBox "エラー発生" Resume Next 'エラーしたコードの次のコードから処理再開させます。 End Sub |
エラールーチンを解除する方法
あるときはエラーを無視したい。
あるときはエラーを検知したい。
こんな時は、On Error GoTo 0 を使用します。
On Error GoTo 0 はエラールーチンを解除するコードです。
例えば、任意のコードを
On Error Resume Next と On Error GoTo 0でサンドイッチすれば、
サンドイッチした範囲のエラー無視が可能です。
※On Error Goto と On Error Goto 0 でサンドイッチしても同様。
On Error Resume Next を解除する時
<コーディングのイメージ>
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub Macro1() 'エラースキップ On Error Resume Next ‘ ここに処理をしたいコードを記載 'On Error Resume Nextを解除する On Error GoTo 0 ‘ここからエラー検知させないコードを記載 End Sub |
On Erro GoTo を解除する時
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub Macro1() 'エラー時 Err1へ飛ぶ On Error GoTo Err1 ‘エラー検知させたいコードを記載 'エラー時にErr1へ飛ばなくする On Error GoTo 0 ‘ここからエラー検知させたくないコードを記載 Exit Sub Err1: Msgbox "エラーを検知しました" Resume Next End Sub |
エラー回避コード使用時の注意点
繰り返しになりますが、
On Error Resume Nextはどんなエラーが発生してもスキップするとても危険なコードです。
本来は修正すべきコードでさえも無視して処理を再開していきます。
エラー理由が分かっている場合にのみ使用しましょう。
編集後記
いかがでしたでしょうか。
エラー回避コードは動作実行を優先させたい場合に有益なコードである反面、
本来は解決すべきだったコーディング内容を無視する危険なコードでもあります。
使用する際は十分に注意してご利用下さい。
ちょっとだけ宣伝
もしVBA全般のルール・基本知識を身に付けたい方がいらっしゃいましたら、
本ブログでは「1週間で分かるVBA 」 なる記事もご紹介していますので、
一度 覗いてみてくれると幸いです。(当然、無料です。)
本ブログ記事をご覧いただいた皆様のVBAライフが少しでも充実させるものになったのならば、管理人としては結構ハッピーです。
末筆ながら 今後ともどうぞよろしくお願いいたします。