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の基本部品として取り入れてみてください。


コメント