【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はエラーメッセージを出さずに黙ってその行をスキップします。
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のエラー無視モードを強制終了し、「通常の安全状態(エラーが起きたら黄色い画面で知らせる状態)」にリセットする命令です。
【正しいコードの書き方例】
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コードの安全性と信頼性は劇的に向上します!