エラー処理(エラー内容をクリアする)

On Error GoTo -1ステートメントは、エラー情報をクリアすることが出来ます。再度エラー処理を適応することが可能になります

'エラー情報をクリアする
On Error GoTo -1

処理を移動させずに、エラー状態の解除のみを実行するには「On Error GoTo -1」ステートメントを使用します

このステートメントを使用する場面は、エラーが発生している状態で、さらにエラーが発生した場合にどうしたいかによります
つまりエラー処理中のエラーはどうするか、という点です

エラー処理中のエラー発生について

エラールーチン中にエラーの再発生したときの動き
エラー処理中のエラー発生時の動き

画像の動きを確認してください
エラーが発生した際、On Error GoToステートメントにより「エラー発生」のラベル行に処理が移動します

このとき、エラー情報は発生したものが保持された状態です
この状態をエラールーチンが行われている状態といいます

このエラールーチン中に、再度エラーが発生した場合はステートメントの影響に関係なく実行時エラーが発生して処理が停止します

エラー処理とはいえ、処理である以上その処理にエラーが発生する可能性があります
その際にユーザーに処理停止を対処させるのは難しい話である場合が多いと思います

そこで、エラー処理中にエラーが発生したら、エラー処理を行いたい
こういった状況が出てくることがあります
そんなときに使用するのが、このステートメントになります

ステートメント使用時のエラー処理

エラールーチン中にエラーを解除する動き
エラー情報をクリアした時の動き

On Error GoTo -1ステートメントを使用している場合の動きになります

エラー発生:
On Error GoTo 0
On Error Resume Next
'Err.Raise (1)
On Error GoTo -1
Err.Raise (1)
Debug.Print "エラー終了"

この処理が画像のエラー処理部分になります

On Error GoTo 0

まず、最初にOn Error GoTo エラー発生の設定を解除するためにこのコードを実行します
これをしていないと、後で発生するエラーでまた「エラー発生:」に戻ってきてしまい無限ループに入ってしまいます

これで、エラーが発生したらメッセージが出て処理が停止する通常の状態になっています

ただ、このステートメントはエラー発生時の制御を解除しただけであり
エラー情報をクリアしたわけではないので、エラールーチンは継続中です

On Error Resume Next
'Err.Raise (1)

次に、エラー処理中にエラーが発生した場合の対応を作成します

今回はエラー処理中に発生したエラーは無視するように設定しますので、On Error Resume Nextステートメントを使用します

2行目はエラー発生させるコードをコメントアウトしています

実際、ここでもまだエラールーチン中なのでエラーが発生した場合は実行時エラーが発生し処理が停止します

On Error GoTo -1

ここでようやく記事のステートメントを使用しています

この時点で、エラー情報がクリアされます
そして、その時点でエラールーチンも終了しています

これにより、上記で設定したエラー発生時の制御が有効な状態になります

Err.Raise (1)
Debug.Print "エラー終了"

画像の動きと合わせて確認してください

ここでエラーを発生させていますが、処理は停止せずに最後のエラー終了の文字列出力まで実行されています

エラー処理中のエラー対応について

通常エラーの解除にはResumeかResume Nextのどちらかのステートメントを使用しますが、このステートメントでは処理が戻ってしまいます

通常、処理の組み方としてはそれが正統な作り方だと思います
でも前述したように、エラー処理を作成するということはそこでもエラーが発生する可能性は十分にあり得ます

例えば、以下の記事の動きを確認してもらいたいのですが
エラー処理でLong型変数に加算していき使用できる整数値で処理が正常に戻ります

ただ、このエラー処理でも使用できる数値がLong型の範囲内になかった場合
加算され続けて、いずれオーバーフローして実行時エラーが発生します

処理上、ほぼあり得ませんが
エラーが出ない処理は無い、ということは事実として存在します

なので、このコードを実行することによってエラーの発生がクリアされるので再度エラーが発生した場合は改めてエラー処理を適応することが出来ます

ただ、エラーの情報がクリアされるので当然エラーの発生した行もどこにあるかが分からなくなります
なので、Resumeステートメントなどでエラー発生した行に戻ることはできなくなるので注意が必要です