忍者ブログ
VBAによる実用アプリケーションの構築、およびGAS(Google Apps Script)やOffice Scriptへのモダンな移行パスを検証・解説するテックブログ。現場で即戦力となるコードモジュールや再利用可能な実用部品を継続的に提供します。

【Excel VBA】On Error Resume Nextを放置してない?バグを隠蔽しないための「On Error GoTo 0」の正しい作法

Excel VBAでエラーを回避しようとして、コードの冒頭に On Error Resume Next を書いたことはありませんか?

「エラーでマクロが途中で止まらなくなって便利!」と気軽に使いがちですが、実はこれ、使い方を誤ると「重大なバグを隠蔽してデバッグ不可能にする」という最大の事故原因になります。

この記事では、On Error Resume Next が持つ危険性と、それを安全に制御するためのペアとなる命令 On Error GoTo 0 の関係性、そしてバグを生ませない正しい書き方を解説します。

1. On Error Resume Next とは?(危険な「居眠り運転」モード)

On Error Resume Next は、コードの実行中にエラーが発生してもマクロを停止させず、「そのまま無視して次の行の処理に進め」という命令です。

ファイルを開く処理や、特定のオブジェクトが存在するかチェックする処理など、「エラーが起きる可能性を想定して安全にスルーしたい場面」で非常に重宝します。

しかし、一度この命令を実行すると、プロシージャ(SubやFunction)が終わるまでVBA全体が「どんなエラーが起きても一切知らせてくれない居眠り運転モード」になってしまいます。

2. なぜ「On Error GoTo 0」がないとヤバいのか?(バグ隠蔽の恐怖)

On Error Resume Next を書いたあと、解除せずに放置すると何が起きるでしょうか?

例えば、後続のコードで変数名のスペルミス(タイポ)をしたり、ゼロ割り計算が発生したりしても、VBAはエラーメッセージを出さずに黙ってその行をスキップします。

Sub DangerousExample()
    On Error Resume Next ' エラー無視モード開始
    
    ' 1. 本当にエラーをスルーしたい処理
    Dim sheet As Worksheet
    Set sheet = Worksheets("存在しないシート")
    
    ' 2. ここで解除しないまま、別の処理を続けると…
    Dim total As Long
    totall = 100 + 200 ' ★変数名を「totall」とタイポ!本来はエラーだが黙ってスキップされる
    
    MsgBox "計算結果: " & total ' 結果は「0」になり、なぜ動かないのか原因不明に!
End Sub

このように、「本当はエラーを出して教えてほしいバグ」まで隠蔽されてしまい、不具合の原因追求(デバッグ)が極めて困難になります。

3. バグを出さない!「ピンポイント挟み」の設計パターン

バグを出さないための鉄則は、「エラーを無視させたい最小限の範囲(1〜2行)だけを挟み込み、すぐに解除する」ことです。ここで登場するのが On Error GoTo 0 です。

On Error GoTo 0 は、VBAのエラー無視モードを強制終了し、「通常の安全状態(エラーが起きたら黄色い画面で知らせる状態)」にリセットする命令です。

【正しいコードの書き方例】

Sub SafeExample()
    Dim lockPath As String
    lockPath = Environ("TEMP") & "\MyApp_Running.lock"
    
    Dim fileNo As Integer
    fileNo = FreeFile
    
    ' ==========================================
    ' 1. エラー無視モードを開始(ピンポイント)
    On Error Resume Next
    
    ' 2. エラーが起きる可能性のある処理だけを実行
    Open lockPath For Binary Access Read Write Lock Read Write As #fileNo
    
    ' 3. エラーが起きたかどうか判定(Err.Number をチェック)
    Dim errCode As Long
    errCode = Err.Number
    
    ' 4. すぐにエラー無視モードを解除!通常状態に戻す
    On Error GoTo 0
    ' ==========================================
    
    ' 5. 判定結果に応じて処理を分ける
    If errCode <> 0 Then
        MsgBox "アプリはすでに起動しています。", vbExclamation
        Exit Sub
    End If
    
    ' ここから下は通常の安全状態なので、タイポや計算ミスがあればVBAがしっかり教えてくれる!
End Sub

4. まとめ

  • On Error Resume Next は、エラーを無かったことにする魔法ではなく「一時的な判定用ツール」。
  • 解除せずに放置すると、後続コードのバグやタイポが隠蔽され、デバッグ地獄に陥る。
  • 危険な処理を通過させたら、直後に必ず On Error GoTo 0 を書いて通常状態に戻す。

「On Error Resume Next を書いたら、セットで On Error GoTo 0 を書く」。この基本を守るだけで、VBAコードの安全性と信頼性は劇的に向上します!



PR