〖ExcelVBA〗On Errorの基本|エラーで止まらない“安全な処理”の書き方(初心者向け)

ExcelVBA

VBAでマクロを作っていると、ある日いきなりこうなります。

  • 実行したら「実行時エラー」で止まる
  • 人によって動いたり動かなかったりする
  • データが無いときだけ落ちる

そんなときに登場するのが On Error です。
On Error を使うと、エラーが起きてもマクロが止まらないようにしたり、安全に処理を分岐できるようになります。

ただし、使い方を間違えると「エラーに気づけない危険なマクロ」になりがちです。
この記事では、初心者でも安心して使えるOn Error の基本と定番パターンをまとめます。


スポンサーリンク
スポンサーリンク

On Error でできること

  • エラーで止まらないようにする
  • エラーが起きたら別の処理に切り替える
  • エラー内容を表示して原因を追いやすくする

まず覚えるOn Errorはこの3つ

① On Error Resume Next(エラーが出ても次へ進む)

On Error Resume Next
' ここでエラーが起きても止まらない

よく使うけど、使いすぎ注意です。
「一時的にエラーを無視したい場所」だけに使うのがコツです。


② On Error GoTo 0(エラー無視を解除する)

On Error GoTo 0

これを入れると、以降は通常通りエラーで止まる状態に戻ります。
Resume Next を使ったら、すぐ GoTo 0 で戻すのが安全です。


③ On Error GoTo ラベル(エラーが出たら指定場所へ飛ぶ)

On Error GoTo ErrHandler

' ここでエラーが出ると ErrHandler に移動

Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました"

「エラーが起きたらメッセージを出す」「後片付けして終了する」など、
きちんとエラー処理を作りたいときに使います。


定番パターン①:無いかもしれないものを安全に扱う(Resume Next の正しい使い方)

実務で多いのが、「見つからなければ何もしない」ケースです。
例えば、SpecialCells は対象が無いとエラーになるため、Resume Next が便利です。

Sub SafeSpecialCells()

    Dim rng As Range

    On Error Resume Next
    Set rng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0

    If rng Is Nothing Then
        MsgBox "空白セルはありませんでした。", vbInformation
        Exit Sub
    End If

    rng.Interior.Color = RGB(255, 230, 230)

End Sub

ポイント

  • Resume Next は1行〜数行の最小範囲で使う
  • すぐに GoTo 0 で解除する
  • 結果(rng が Nothing か)で分岐して安全に進める

定番パターン②:存在チェック(削除や取得がエラーになりそうな時)

シート削除など「存在しないとエラー」になる処理でもよく使います。

Sub DeleteSheetSafely()

    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets("一時").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0

    MsgBox "『一時』シートがあれば削除しました。", vbInformation

End Sub

「無ければ無いでOK」の処理なら、こういう書き方が実務で強いです。


定番パターン③:エラー内容を表示して終了する(GoTo ErrHandler)

「止まらない」のではなく、エラーを把握して安全に終了する書き方です。
本番運用するマクロは、この形がおすすめです。

Sub SafeMain()

    On Error GoTo ErrHandler

    ' 例:ここにメイン処理を書く
    Call DoSomething

    MsgBox "処理が完了しました。", vbInformation
    Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "番号:" & Err.Number & vbCrLf & _
           "内容:" & Err.Description, vbExclamation

End Sub

Private Sub DoSomething()
    ' サンプル:わざとエラー
    Dim x As Long
    x = 1 / 0
End Sub

よく使う Err の情報

  • Err.Number:エラー番号
  • Err.Description:エラー内容(文章)

絶対に避けたいNG例(エラーを“握りつぶす”)

次のように、Resume Next を入れっぱなしにすると危険です。

Sub NGExample()

    On Error Resume Next

    ' エラーが出ても止まらないので、失敗に気づけない
    Worksheets("集計").Range("A1").Value = "OK"
    Workbooks("存在しない.xlsx").Close

    ' どこで失敗したか分からないまま処理が進む
    MsgBox "完了"

End Sub

これだと、実際は何もできていないのに「完了」と出ることがあります。
Resume Next は必要な場所だけ短く使うのが鉄則です。


初心者向け:最小限で安全な書き方テンプレ

「とりあえず安全に書きたい」場合は、次の形が使いやすいです。

Sub TemplateSafe()

    On Error GoTo ErrHandler

    ' === メイン処理 ===

    Exit Sub

ErrHandler:
    MsgBox "エラー:" & Err.Number & vbCrLf & Err.Description, vbExclamation

End Sub

まずはこの形をベースにして、必要な場面だけ Resume Next を使うと失敗しにくいです。


まとめ:On Errorは「短く」「戻す」「分岐する」

  • Resume Next は最小範囲で使う
  • 使ったら GoTo 0 ですぐ戻す
  • 本番マクロは GoTo ErrHandler でエラー内容を表示して安全終了

On Error を正しく使えるようになると、
「人によって動かない」「データが無いと落ちる」問題が激減します。
ぜひ、あなたのVBAの基本部品として取り入れてみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました