Excel VBAでエラー処理の方法をお探しですね。

広告

Excel VBAのエラー処理、正しく使えてますか?「止めないため」じゃなくて「安全に動かすため」の基本

Excel VBAでマクロを作っていると、必ずエラーに遭遇します。

「シートが見つかりません」「VLOOKUPで値が取れません」「ファイルが開けません」……こうしたエラーが出るたびにマクロが止まってしまうと困るので、エラー処理を入れることになります。

でも、ちょっと待ってください。

エラー処理って、ただ「マクロを止めないようにする」ためのものだと思っていませんか?実は、それだけじゃないんです。

むしろ大事なのは、**エラーが起きたときにちゃんと気づいて、必要なら処理を止めて、続けて大丈夫なときだけ先に進む**こと。

たとえば売上データを集計しているときに、単価が文字列になっていて計算できないとします。

このとき、エラーを無視してそのまま進んでしまうと、合計金額が少ないまま処理が終わってしまいます。

こんなふうに、「止まらないこと」よりも「データの不具合に気づけること」のほうが大切な場面って、実はすごく多いんです。

この記事では、VBAでよく使う「On Error Resume Next」と「On Error GoTo」の正しい使い方と使い分けを、初心者の方にも分かりやすく解説します。

1. エラー処理の本当の役割って?「隠す」じゃなくて「コントロールする」こと

VBAのエラー処理でよく使われるのは、次の3つです。

– **On Error Resume Next** → エラーが起きても次の行に進む
– **On Error GoTo ラベル** → エラーが起きたら指定した場所にジャンプする
– **On Error GoTo 0** → エラー処理を解除して、通常の状態に戻す

この3つ、似ているようで役割がぜんぜん違います。

何となく書くんじゃなくて、**「どの範囲で、どんなエラーを、どう扱うのか」をちゃんと決めて使う**のが大事です。

特に初心者の方がやりがちなのが、「エラーが出るとうっとうしいから、とりあえずプロシージャの最初に `On Error Resume Next` って書いとこう」というパターン。

これ、一見便利なんですけど、実はかなり危険です。

なぜかというと、**本来止まるべきエラーまで無視されてしまう**から。

たとえば、セルの参照ミスや保存エラーが起きても気づけなくなって、バグの発見がめちゃくちゃ難しくなります。

エラー処理は、エラーを隠すためのものじゃなくて、**エラーをコントロールするためのもの**。

安全なマクロを作るには、「想定内のエラー」と「想定外のエラー」を分けて考えて、想定外のエラーはちゃんとメッセージやログで把握できるようにしておくことが大切です。

2. On Error Resume Nextの正しい使い方と、やってはいけない使い方

`On Error Resume Next` は、「エラーが起きても止まらずに、次の行から処理を続ける」という命令です。

こんなときに使います:

– 存在するか分からないシートを削除したい
– 存在しないかもしれない図形を削除したい
– VLOOKUPで値が見つからなかったときだけ別の処理をしたい

つまり、**エラーが起きる可能性を事前に理解していて、そのエラーが起きても問題ない場合**に限って使うのが基本です。

逆に、計算処理やデータ更新処理みたいに、**エラーを見逃すと結果がおかしくなる処理**では、安易に使っちゃダメです。

安全に使うための鉄則

1. **必要な処理の直前で有効にする**
2. **処理が終わったらすぐに `On Error GoTo 0` で解除する**
3. **エラーが発生したかどうかを `Err.Number` で確認する**
4. **必要なら `Err.Description` で内容を取得する**
5. **エラー情報を確認したら `Err.Clear` でクリアする**

`Err.Number` は、直近のエラー番号を保持しているプロパティです。

0以外なら、何らかのエラーが発生したということ。

エラー情報を確認したら、`Err.Clear` でクリアしておくと、後続処理で古いエラー情報を間違って判定しちゃうのを防げます。

実際のコード例

“`vb
Sub DeleteResultSheet()
On Error Resume Next
Application.DisplayAlerts = False
Worksheets(“結果”).Delete

If Err.Number <> 0 Then
Debug.Print “結果シートは存在しません: ” & Err.Description
Err.Clear
End If

Application.DisplayAlerts = True
On Error GoTo 0
End Sub
“`

この例では、「結果」というシートが存在しなくてもエラーで止まらずに処理を続けられます。

ポイントは、**エラーを無視する範囲をシート削除の周辺だけに限定している**こと。

もし `On Error GoTo 0` を書かないまま後続処理に進むと、別のセル参照ミスや保存エラーまで無視されちゃう可能性があります。

`On Error Resume Next` は強力な命令ですが、**効果範囲を最小限にする**ことで安全に使えます。

「想定内のエラーだけを、短い範囲で受け流して、必ず解除する」と覚えておくと、実務でも事故を防ぎやすくなります。

3. On Error GoToは、想定外のエラーを受け止める基本形

`On Error GoTo ラベル` は、エラーが発生したときに指定したラベル(場所)へ処理を移動させる命令です。

`On Error Resume Next` が「その場を通過する」処理だとすれば、`On Error GoTo` は**「エラー処理専用の出口へ誘導する」**処理です。

こんなときに使います:

– ファイルを開く
– 外部データを読み込む
– 複数のシートを更新する

途中で失敗したときに、メッセージを表示したり、開いたブックを閉じたり、ログを残したりする必要がある処理では、`On Error GoTo` を使うほうが適しています。

ユーザーに分かりやすく通知できるし、保守しやすいコードになります。

絶対に忘れちゃいけないこと

`On Error GoTo` を使うときは、**通常処理の最後に `Exit Sub` または `Exit Function` を書く**のが超重要です。

これを書かないと、エラーが発生していない場合でも、下にあるエラー処理ラベルまで処理が流れちゃって、「正常に終わったのにエラーメッセージが出る」という不自然な動きになります。

エラー処理ラベルは、通常処理とは別の入口として考えて、**正常時は必ずその手前でプロシージャを抜ける構造**にします。

実際のコード例

“`vb
Sub ImportData()
On Error GoTo ErrorHandler

Workbooks.Open “C:\data\売上.xlsx”
ActiveWorkbook.Worksheets(1).Range(“A1”).Value = “取込済”
ActiveWorkbook.Close SaveChanges:=True

MsgBox “処理が正常に完了しました。


Exit Sub

ErrorHandler:
MsgBox “処理中にエラーが発生しました。

” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description
End Sub
“`

この形にしておくと、エラーが発生した場合だけ `ErrorHandler` へ移動して、エラー番号と内容を確認できます。

さらに実務では、**`Err.Number` によって処理を分ける**と便利です。

たとえば「ファイルが見つからない」「アクセス権がない」「Excel操作に失敗した」など、原因によってユーザーへの案内や復旧方法が変わるからです。

`On Error GoTo` は、単にエラーを表示するだけじゃなくて、**マクロを安全に終了させるための標準的な枠組み**として使うと効果的です。

4. 実務での使い分けと、ログ設計まで含めたベストプラクティス

`On Error Resume Next` と `On Error GoTo`、どっちが優れているとかじゃなくて、**使う場面が違う**んです。

使い分けの基準

– **Resume Next向き**: 存在確認や削除処理など、「失敗しても想定内で、すぐ判定できる処理」
– **GoTo向き**: 途中で止めるべきエラー、ユーザーに通知すべきエラー、後片付けが必要な処理

たとえば、存在しない図形を削除しようとして失敗する程度なら `Resume Next` で十分。

でも、売上集計の計算式が失敗した場合は、無視せずに `GoTo` でエラー処理へ進めたほうが安全です。

大量データ処理のときは?

大量データや複数ファイルを処理するバッチ処理では、「エラーが出たらすぐ止める」だけじゃなくて、**「処理を続けつつ、最後に失敗内容をまとめて表示する」**設計が役立ちます。

ただし、この場合も単に `Resume Next` で流すんじゃなくて、**どのレコード、どのファイル、どの処理で失敗したのかを記録する**必要があります。

記録しておくといい情報:

– エラー件数
– 処理済み件数
– 処理できなかった件数
– 発生時刻
– `Err.Description`(エラーの内容)

実務のマクロでは、処理が終わったことだけじゃなくて、**どの程度正しく終わったのかを利用者に伝える**ことが重要です。

迷ったときの判断基準

判断に迷ったときは、次の基準で使い分けると分かりやすくなります:

1. **存在しない可能性を前提にした確認・削除処理**は、短い範囲で `On Error Resume Next` を使う
2. **データ更新、計算、保存、外部ファイル操作**は、原則として `On Error GoTo` で受け止める
3. **エラーを続行する場合でも**、件数・対象名・内容をログやメッセージに残す

開発中はあえてエラーを止めてみる

開発中は、あえてエラーを止めて原因を確認する姿勢も大切です。

最初からすべてのエラーを無視してしまうと、データ形式の不備や参照範囲の間違いに気づけません。

ある程度エラーの傾向が分かって、「これは想定内の失敗として扱える」と判断できてから、`Resume Next` で限定的に処理するほうが安全です。

まとめ:エラー処理は「信頼できるツール」にするための設計

Excel VBAのエラー処理は、マクロを止めないための小技じゃなくて、**信頼できる業務ツールにするための設計**です。

– `On Error Resume Next` は短く限定して使う
– `On Error GoTo` は想定外エラーを確実に受け止める

この基本を守ることで、後から見ても原因を追いやすくて、利用者にも安心して使ってもらえるVBAコードになります。

エラー処理をちゃんと理解して使いこなせば、あなたのマクロはもっと安全で、もっと信頼されるものになりますよ!

広告