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コードになります。
エラー処理をちゃんと理解して使いこなせば、あなたのマクロはもっと安全で、もっと信頼されるものになりますよ!
広告
