VBAの『On Error Resume Next』って何?つまづき女がやさしく解説

エクセルVBAを触っていると、「On Error Resume Next」という謎の一文に出会います。
日本語にすると「エラーが出ても、とりあえず次へ進みます」という意味の命令です。

私も最初は「便利そう!」と思って多用してしまい、後から「処理がこっそり飛ばされていた…」と冷や汗をかいたことがあります。

この記事では、つまづき女が自分の失敗も含めて、この命令をやさしく説明してみます。

On Error Resume Next の意味

「On Error Resume Next」は、VBAの処理中にエラーが起きてもマクロを止めずに、次の行から処理を続けなさい、という命令です。

ふつうは実行時エラーが出るとダイアログが表示されてマクロが止まりますが、この命令を使うと、その停止を一時的にオフにできます。

ただし「エラーを直してくれる」わけではなく、「見なかったことにして先へ進む」だけなので、使い方には注意が必要です。

基本の書き方と動き方

書き方はとてもシンプルで、エラーを無視したい処理の前に一行書くだけです。

Sub Sample()
    On Error Resume Next   ' ここから「エラーを無視して次へ」が有効になる

    ' ここでエラーが出ても止まらず、次の行へ進む
    Debug.Print 1 / 0      ' 本来は「ゼロによる除算」でエラー

    Debug.Print "ここまで来ます"

    On Error GoTo 0        ' エラー無視モードを解除
End Sub

この例では、本来なら「ゼロによる除算」で止まるところが、On Error Resume Next によって止まらず、次の行に進みます。

最後の「On Error GoTo 0」は、エラー無視モードを解除する命令で、これを書かないとその後のコード全体でエラーがずっと無視され続けてしまいます。

どんな場面で便利なのか

この命令が役立つのは、「あれば処理したいけれど、無ければスキップしてもいい」というような場面です。

例:存在するか分からないシートを「もしあれば」処理したい場合。

Sub ProcessIfSheetExists()
    Dim ws As Worksheet

    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets("集計用")   ' 無いかもしれないシート
    On Error GoTo 0

    If ws Is Nothing Then
        MsgBox "集計用シートがありません。今日は処理をお休みします。"
        Exit Sub
    End If

    ' ここから先は、シートが存在する場合だけ処理する
    MsgBox ws.Name & " を処理します。"
End Sub

この書き方では、あえてエラーを起こして、取得できたかどうかを自分で確認するという形になっています。

「On Error Resume Next」で一時的にエラーを無視し、その直後に「On Error GoTo 0」で解除し、さらに Is Nothing でちゃんと確認するのが基本パターンです。

よくある落とし穴

一番の落とし穴は、「エラーが出ないからといって、正しく動いているとは限らない」という点です。

On Error Resume Next を入れてしまうと、処理が途中でスキップされていても画面には何も出ないため、「気づかないうちに結果がおかしい」となりがちです。

よくある失敗パターン(40代つまづき女バージョン):

  • とりあえずマクロの先頭に On Error Resume Next を書いてしまう
  • どこでエラーが起きているか分からず、「なんか結果が変…」とモヤモヤする
  • 結局、原因調査に余計な時間を使ってメンタル消耗…

堅牢なマクロを作りたいときには、On Error Resume Next は「エラーを隠す」だけなので、安易に全体にかけると時限爆弾になりやすいと指摘されています。

安全に使うための3つのルール

On Error Resume Next をそれでも使いたいときは、次の3つのルールを守ると事故が減ります。

  1. 「局所的にだけ」使う
    必ず「この数行だけ」という範囲を決めて、終わったらすぐ On Error GoTo 0 で解除する。
  2. 「直後に確認処理を書く」
    オブジェクトなら Is Nothing、他の処理なら Err.Number などで「失敗したかどうか」を必ず自分でチェックする。
  3. 「デバッグ中はなるべく使わない」
    開発中はエラーを止めてくれた方が原因が分かりやすいので、まずは普通にエラーを出して動きを確認してから、必要なところだけに絞って使う。

言い換えると、「エラーを無かったことにする」のではなく、「一時的に後回しにして、後で自分で確認する」という意識で書くと、安全に付き合えます。

まとめ

On Error Resume Next は、「エラーで止まらないようにするお守り」ではなく、「使い方を間違えると、見えないところで処理が抜け落ちる小さな罠」でもあります。

私も、仕事のVBAで何度かこの罠にハマり、あとから「全部チェックし直し」という残業コースを経験しました。

同じようにエクセルでつまづきながら勉強している40代の方は、ぜひ「局所的に使う」「直後に確認する」の2点だけ覚えておいて、一緒にエラーと仲良く(?)付き合っていきましょう。

error: Content is protected !!
タイトルとURLをコピーしました