【Excelマクロ】エラー処理On Error Resume Nextの落とし穴

便利そうに見えるエラー無視

VBAでよく見かける構文に On Error Resume Next があります。

この一文をコードの冒頭に書いておくだけで、エラーが発生してもマクロが止まらずに次の行へ進むという仕様になります。

たとえば次のようなコードです。

Sub Sample()

    Dim ws As Worksheet

    On Error Resume Next
    Set ws = Worksheets("データ")
    ws.Range("A1").Value = "テスト"
    On Error GoTo 0

End Sub

このマクロは「データ」シートが存在しない場合でもエラーを表示せず、次の処理に進んでしまいます。実行は止まりません。

一見、柔軟で便利なように思えるかもしれませんが、エラーに気づけないという大きな落とし穴があります。

実例で学ぶ「気づけないエラー」

たとえば、存在しないシートにアクセスしようとしても、何も表示されずに終了してしまいます。

Sub TestError()

    Dim ws As Worksheet

    On Error Resume Next
    Set ws = Sheets("存在しない")
    ws.Range("A1").Value = "OK"
    On Error GoTo 0

End Sub

このコード、ぱっと見では正常に動いているように見えます。

しかし実際は Set ws = Sheets("存在しない")ws は実際にはシートが存在しないので、 Nothing になっています。※今回はわかりやすいように「存在しない」というシート名にしていますが、想定していたシート名が入っていると考えてください。

動作上は Nothing.Range("A1") となるので、処理は実は何もしていません。

つまり、処理がスキップされただけで何も書き込まれていないのです。

より安全な書き方

次のようにエラーが起きたことがわかる仕組みに変えるのがよいです。

Sub SafeSetSheet()

    Dim ws As Worksheet

    On Error Resume Next
    Set ws = Sheets("存在しない")
    On Error GoTo 0

    If ws Is Nothing Then
        MsgBox "シートが見つかりませんでした。"
        Exit Sub
    End If

    ws.Range("A1").Value = "OK"
End Sub

このように「意図的に」 On Error Resume Next を使い、その直後に On Error GoTo 0 で一度リセットする、そして条件判断でエラーを把握するという流れが大切です。

実装するメリットと注意点

メリット

  • マクロ全体を止めずに処理を続けられる(開発中は特に有効)
  • 既存ファイルやシートが無い状況に対応できる
  • 例外的な処理を「仕方ない」として許容できる

注意点

  • エラーを放置したまま次へ進むとバグに気づけない
  • 本来必要な処理が飛ばされても、気づかない
  • 他の人が見たときに、何が起きているのかわかりにくい

まとめ

エラー処理は、マクロの信頼性に大きく影響します。

特に「知らないうちに処理がスキップされていた」では、実務で致命的なミスになりかねません。

On Error Resume Next は、正しく使えばとても強力な味方になりますが、間違った使い方をすればトラブルの原因になります。

まずは「何のためにエラー処理を入れるのか?」を考えながら、意図のあるコードに仕上げていきましょう。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール