No.005
エラーの種類、そしてエラー処理の設置方法について 《On Error GoTo》
2003/2007/2010/2013
日ごろのVBA作成において、エラーはつきものですね。
ちなみにエラーには次の3種類があります。
- コンパイル エラー …構文上の誤りがある場合に発生するエラー
- 実行時エラー. …構文上は正しくても、実際には実行できない処理が記述されていた場合に発生するエラー
- 論理エラー …プロシージャに実行時エラーは発生せず最後まで実行されるが、期待どおりの結果が得られない
コンパイル エラーは、すぐに間違いがわかるので、そこを修正すればよしです。
論理エラーは、実行し最後まで走るものの、なんの音沙汰もなくうまくいかないため、記述とにらめっこし、「F8」キーを使用して1行ずつ実行、もしくはブレークポイントを設置して部分的に実行して問題箇所を突き止めていきます。
順序が前後しましたが、実行時エラー、よく遭遇するかと思います。実行時エラーが検出されると上図のようなメッセージが表示されます。
[デバッグ]ボタンをクリックすると、VBEが開き問題個所のステートメントが黄色く表示されて処理が中断します。
[終了]ボタンをクリックすると、プロシージャの処理は途中のその時点で終了します。
実行時エラーは問題個所がわかりやすいですので、そこを修正すればよしです。
さてこの実行時エラー、メッセージが表示されそこで処理が中断するわけですが、ユーザーがVBA未経験の方の場合はびっくりですし、経験者も自分が作成したものでなければ面倒なことに巻き込まれた感は否めないでしょう。
ここで、もし想定できるエラーである場合や、エラーを無視しても大丈夫である処理の場合には、エラー処理を設置しておくことで、エラーを難なくやりすごすことができるようになります。
ではここから、エラー処理に利用される3つのステートメントをご紹介していきます。
- On Error GoToステートメント …エラーの場合に対処する
- On Error Resume Nextステートメント …エラーを無視する
- On Error GoTo 0ステートメント …エラー処理を無効にする
<On Error GoToステートメント>
下記のサンプルは、シートを削除するのですが、対象シートがなくて実行時エラーが出る可能性があり、エラー処理をしています。
Sub Sample()
On Error GoTo ErrShori
Worksheets("Sheet5").Delete
MsgBox "シートを削除しました。"
Exit Sub
ErrShori:
MsgBox "対象シートは存在しませんでした。"
End Sub
ではここで、少し気を付けたいところをご案内します。
まずは書き方です。
「On Error GoTo ~」と「ErrShori:」の行は、基本的に字下げせず先頭から記述します。
次に「ErrShori」が2度出てきますが、同じ文字列にすること、文字列は任意で構いません。
そして流れです。
.Deleteの行でエラーが出なかった場合は、「削除しました。」のメッセージ、次の「Exit Sub」でSubプロシージャから抜けて終了します。
この「Exit Sub」がないと、そのまま下のエラー処理に突入し、「存在しませんでした。」のメッセージも表示されてしまいますので、おかしなことになります。
したがってとても重要な1行なのです。
.Deleteの行で実行時エラーが出た場合、エラーで止めずに「ErrShori:」の行にジャンプします。そして「存在しませんでした。」のメッセージ、その後終了します。
ジャンプ後の処理内容は、今回メッセージにしましたが、なんでも構いません。
「ErrShori:」の行の次に何も記述をしない場合は、何も起こらずに終了します。
この構文を初めて記述した方は是非とも、「F8」キーを使用して1行ずつ中断モードで実行し、その流れを動作確認してみてください。
On Error GoTo ステートメントの詳細は、下記の<ヘルプmemo>でもご確認ください。
<On Error Resume Nextステートメント>
プロシージャ名の下すぐに、字下げせず先頭から「On Error Resume Next」と書き、あとは普通に記述します。
On Error Resume Nextステートメントは、実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行を継続します。
すべてのエラーを無視して進めることができます。
<On Error GoTo 0ステートメント>
On Error GoTo 0ステートメントは、現在のプロシージャに含まれる使用可能なエラー処理を無効にします。
例えば、プロシージャの途中から一部分エラーを無視、その後エラー処理を解除します。
通常処理
On Error Resume Next
エラーを無視して続行させる処理
On Error GoTo 0
通常処理
この場合、通常処理のところでエラーが発生した場合は、プログラムは中断します。
ヘルプmemo
<On Error GoToステートメント>
実行時エラーが発生したときに、プロシージャを中断せずにエラー処理ルーチンにプログラムの制御が移り、エラー処理ルーチンが実行されるようにします。
書式を簡単に書くと、次のようになります。
On Error GoTo line
通常実行する処理
Exit Sub
line:
エラー時に実行する処理
引数lineには、分岐先の行ラベルまたは行番号(任意の文字列、数字)を指定します。
行ラベルや行番号とは、プロシージャ内の位置を特定するための文字列です。