目次
はじめに
VBAのエラー処理 On Error GoTo [ラベル名]
は、一度設定すると、そのプロシージャが終了するまで有効です。しかし、「マクロの一部分だけでエラーを監視し、それ以外の部分では通常通りエラーで停止させたい」という場面があります。
このような場合に使うのが On Error GoTo 0
という特別なステートメントです。この命令は、設定したエラーハンドラを解除し、VBAの標準のエラー処理(エラーが発生したらダイアログを表示して停止する)に戻す働きをします。
この記事では、On Error GoTo 0
を使って、プロシージャの特定の部分だけを対象にエラーハンドリングを適用する、より高度なテクニックを解説します。
On Error GoTo 0
を使ったサンプルコード
このマクロは、割り算を行う部分でのみ「ゼロ除算」エラーを監視し、その処理が終わったらすぐにエラー監視を解除します。
完成コード
' 特定の箇所だけでエラーハンドリングを行う
Sub ScopedErrorHandlingExample()
Dim numerator As Double, denominator As Double, result As Double
numerator = 100
denominator = 0 ' エラーを発生させる値
'--- 処理A: ここでエラーが発生したら、VBAは通常通り停止する ---
' MsgBox 1 / 0 ' このコメントを外すと、エラーハンドラ設定前に停止する
MsgBox "これからエラーが発生する可能性のある処理を開始します。"
'--- エラーハンドラを設定 ---
On Error GoTo DivisionErrorHandler
'--- 処理B: エラーハンドリングの対象となる処理 ---
result = numerator / denominator
MsgBox "計算結果: " & result
'--- エラーハンドラを解除 ---
On Error GoTo 0
'--- 処理C: ここでエラーが発生しても、既にハンドラは解除されているためVBAは停止する ---
MsgBox "エラー監視は解除されました。"
' MsgBox 1 / 0 ' このコメントを外すと、エラー処理には飛ばずに停止する
' 正常終了時はエラー処理ブロックをスキップ
Exit Sub
'--- エラー処理ブロック ---
DivisionErrorHandler:
MsgBox "計算エラー:0で割ることはできません。", vbCritical, "エラー"
' エラー処理後、次の行(On Error GoTo 0)から処理を再開する場合は Resume Next を使う
' Resume Next
End Sub
コードの解説
On Error GoTo DivisionErrorHandler
この行から、エラーの監視が始まります。これ以降に発生したエラーは、DivisionErrorHandler:
ラベルにジャンプします。
On Error GoTo 0
この一行が、エラー監視を解除する命令です。
0
は特別な引数で、「これ以降のエラーはVBAの標準のルールで処理しなさい」という意味になります。- この行が実行された後、もしエラーが発生しても
DivisionErrorHandler:
にはジャンプせず、VBAの標準のエラーダイアログが表示されてマクロは停止します。
なぜ On Error GoTo 0
を使うのか?
- スコープの限定: 複数の異なる種類のエラーが発生しうる長いプロシージャで、「この数行はファイルI/Oエラーを、この数行は計算エラーを」というように、エラー処理のロジックを細かく分けたい場合に役立ちます。
- デバッグの容易化: 開発中に、意図しないエラーがカスタムエラーハンドラによって握りつぶされてしまうのを防ぎたい場合に、一時的にエラー監視をオフにすることができます。
まとめ
今回は、On Error GoTo 0
を使って、設定したエラーハンドラを途中で解除する方法を解説しました。
On Error GoTo [ラベル名]
: エラー監視を開始する。On Error GoTo 0
: エラー監視を解除し、VBAの標準動作に戻す。
全てのプロシージャで必要になるわけではありませんが、複雑な処理を記述する際には、この「エラー監視のオン/オフ」を使いこなせるようになると、より精密で堅牢なエラー処理を実装することができます。