On Error Resume Nextの落とし穴|VBAで気づかないうちに処理がスキップされる理由

On Error Resume Next は、エラーが起きてもマクロを止めずに次の行へ進む命令です。

便利に見えますが、使い方を間違えると「処理がこっそりスキップされているのに気づけない」という落とし穴があります。正しく使うには、エラーが起きたかどうかを自分で確認する仕組みをセットで用意する必要があります。

この記事では、次の内容を順番に解説します。

  • On Error Resume Next とは何か
  • どんな落とし穴があるか
  • 安全な使い方
  • On Error GoTo 0 との組み合わせ方

On Error Resume Nextとは?

コードの中に 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 には何も入っていない状態になっています。

その結果、ws.Range("A1").Value = "OK" も実際には何もしていません。処理がこっそりスキップされているのに、画面上は何も起きていないように見えるのです。

これがOn Error Resume Nextの一番の落とし穴です。「エラーが出ない=正しく動いている」ではないということを覚えておきましょう。

安全な使い方は?

On Error Resume Next を使う場合は、その直後に「エラーが起きたかどうか」を自分で確認する処理を入れます。シートを取得する場合は、取得できたかどうかを Is Nothing で確認するのが基本の形です。

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 でエラーの無視を解除します。
  • If ws Is Nothing Then でシートが取得できたかどうかを確認します。取得できていなければメッセージを出して処理を止めます。

On Error GoTo 0とは?

On Error GoTo 0 は、On Error Resume Next の効果を解除する命令です。これを書かないと、その後のコード全体でエラーが無視され続けます。

On Error Resume Next を使ったら、必要な処理が終わった直後に On Error GoTo 0 を書いてリセットするのがお約束です。

まとめ

On Error Resume Next は正しく使えば便利ですが、エラーに気づけなくなるリスクがあります。使うときは必ずセットで確認の処理を入れましょう。

  • On Error Resume Next:エラーが起きても次の行に進む。エラーを無視するのではなく「一時的に後回しにする」イメージ。
  • On Error GoTo 0:On Error Resume Nextの効果を解除する。使い終わったら必ず書く。
  • Is Nothing で確認:シートや変数が取得できたかどうかを、自分で確認する処理をセットで入れる。
  • エラーが出ない≠正しく動いている:処理がスキップされていても画面には何も出ないので注意。

よくある質問

On Error Resume Nextはどんな場面で使うのが適切?

「シートやファイルが存在するかどうかわからないが、あれば処理したい」というケースに向いています。存在チェックのためにあえてエラーを起こして、その結果を確認するという使い方です。ただし必ず直後に On Error GoTo 0 と確認処理をセットにしてください。

On Error Resume Nextを書かずにエラーが起きるとどうなる?

赤いエラー画面が表示されてマクロが止まります。どこでエラーが起きたかがすぐにわかるので、開発中や原因を調べたいときはあえてOn Error Resume Nextを使わない方が便利です。

Is Nothingとはどういう意味?

変数に何も入っていない状態かどうかを確認する書き方です。シートや変数をうまく取得できなかった場合、その変数は「空っぽ(Nothing)」の状態になります。If ws Is Nothing Then で「wsが空っぽだったら」という条件を確認できます。

On Error GoTo 0を書き忘れるとどうなる?

その後のコード全体でエラーが無視され続けます。別の場所でエラーが起きても気づけなくなるため、必ず使い終わったらすぐに書くようにしましょう。

エラーが起きたときに専用のメッセージを出す方法は?

On Error GoTo ラベル名 という書き方を使うと、エラーが起きたときに指定した場所にジャンプして処理を実行できます。On Error Resume Next よりも細かくエラーの対応を書きたい場合に使います。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

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

上部へスクロール