【VBA】エラー処理を途中で解除する On Error GoTo 0 の使い方

目次

はじめに

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 を使うのか?

  1. スコープの限定: 複数の異なる種類のエラーが発生しうる長いプロシージャで、「この数行はファイルI/Oエラーを、この数行は計算エラーを」というように、エラー処理のロジックを細かく分けたい場合に役立ちます。
  2. デバッグの容易化: 開発中に、意図しないエラーがカスタムエラーハンドラによって握りつぶされてしまうのを防ぎたい場合に、一時的にエラー監視をオフにすることができます。

まとめ

今回は、On Error GoTo 0 を使って、設定したエラーハンドラを途中で解除する方法を解説しました。

  • On Error GoTo [ラベル名]: エラー監視を開始する。
  • On Error GoTo 0: エラー監視を解除し、VBAの標準動作に戻す。

全てのプロシージャで必要になるわけではありませんが、複雑な処理を記述する際には、この「エラー監視のオン/オフ」を使いこなせるようになると、より精密で堅牢なエラー処理を実装することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次