サイトアイコン マメBlog

【VBA】エラー無視の落とし穴?Resume Nextを安全に使う実践テクニック

 

頑張って作ったVBAコードでエラーが発生するたびに処理が止まってしまう。エラーが発生するときと、しないときがある。

 

こんな問題は、エラーを無視する『On Error Resume Next』で解決できます。

 

『On Error Resume Next』を正しく設定すれば、不要なエラー発生を防ぎ安定したVBAコードに仕上げることが可能。

一方、間違った使い方をすると重要なデータが失われる危険性があるので注意が必要です。

 

この記事では、安全なエラー無視のテクニックをコピペで使えるサンプルコードとともに解説します。

 

VAB初心者の方でも理解できるよう、基本的な仕組みから危険なパターンまでをわかりやすくまとめました。

 

安定したVBAコードを作成するためにも、正しいエラーを無視する『On Error Resume Next』の使い方をマスターしてください。

 

VBAのエラー無視とは?On Error Resume Nextの基本知識

VBAでプログラムを動かしていると、時々エラーが発生して処理が止まってしまう。。。

「エラーを無視して次の処理に進んでほしい」と思うことってありますよね。

 

VBAには「On Error Resume Next」という便利な機能があり、これを使うとエラーが発生しても処理を続けることができます。

しかし、

この機能は非常に強力である反面、使い方を間違えると重大な問題を引き起こす可能性があります。

 

正しい理解と適切な使用方法で、安全で効率的なVBAコードを設定しましょう。

 

On Error Resume Nextの基本的な書き方と動作原理

『On Error Resume Next』は、

エラーが発生した行をスキップして次の行から処理を続ける命令文

です。

 

通常、VBAでエラーが発生すると実行時エラーダイアログが表示されてプログラムが停止します。

しかし、

『On Error Resume Next』を使うことでエラーを無視して処理を継続してくれます。

 

基本的な書き方は非常にシンプルで、

プロシージャの最初、もしくはエラーを無視したい処理の直前に記述する

たったこれだけです。

 

『On Error Resume Next』を使ったサンプルコードがこちら

Sub サンプル処理()
On Error Resume Next

' エラーが発生する可能性のある処理
Range("A1").Value = Range("B1").Value / Range("C1").Value

' エラーが発生してもここの処理は実行される
MsgBox "処理が完了しました"
End Sub

 

この例では、C1セルが0や空白の場合に0除算エラーが発生しますが、『On Error Resume Next』の効果により処理がコードの最後まで継続されます。

 

エラー無視が必要になる3つの典型的なケース

実際の業務でエラー無視が必要になるケースは主に3つあります。

 

データやファイルの問題を一つ一つ解決していては手作業での処理と同じくらい時間がかかる

 

オブジェクトを削除するときに発生するエラーを無視するサンプルコードがこちら

Sub 図形一括削除()
On Error Resume Next

' 存在するかわからない図形を削除
ActiveSheet.Shapes("図形1").Delete
ActiveSheet.Shapes("図形2").Delete
ActiveSheet.Shapes("図形3").Delete

On Error GoTo 0 ' エラー処理を元に戻す
End Sub

 

図形2だけ手動で削除していた場合、「ActiveSheet.Shapes(“図形2”).Delete」でエラーが発生しますが

『On Error Resume Next』の効果でエラーを無視することが可能。

 

これらのケースでは、エラーが発生すること自体が正常な動作の一部として想定されているため、『On Error Resume Next』の使用が適切といえます。

 

通常のエラー処理(On Error GoTo)との違いを比較

『On Error Resume Next』と『On Error GoTo』の最大の違いは、エラー発生時の動作です。

 

『On Error GoTo』は、エラーが発生した際に指定したラベルにジャンプしてエラー処理を行った後、通常は処理を終了します。

一方、『On Error Resume Next』はエラーを無視して次の行から処理を継続します。

 

『On Error GoTo』を使った場合、エラーの内容を詳しく調べたり、ユーザーに適切なメッセージを表示したり、ログファイルに記録したりといった細かな制御が可能です。

 

『On Error GoTo』を使ったサンプルコードがこちら

Sub 通常のエラー処理()
On Error GoTo ErrorHandler

' エラーが発生する可能性のある処理
Range("A1").Value = Range("B1").Value / Range("C1").Value

Exit Sub

ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description
End Sub

 

上記のコードは

エラーが発生すると9行目のコードにジャンプしてメッセージボックスを表示する

という内容です。

 

どのようにエラー処理をしたいのかを明確にし、『On Error Resume Next』と『On Error GoTo』を使い分けて使用しましょう。

 

エラー無視の危険な落とし穴とデメリット

『On Error Resume Next』は便利な機能ですが、無計画に使用すると重大な問題を引き起こす可能性があります。

 

最も危険なのは、

本来検出すべき重要なエラーを見逃してしまうこと

です。

 

起こりえる事象がこちら

 

ここからは、

『On Error Resume Next』の間違った使用による発生するリスク

を具体的にご紹介します。

 

データ不備を見逃すリスクと実際の被害例

エラー無視の最も深刻な問題は、

データの不備や計算ミスを見逃してしまうこと

です。

 

たとえば、

売上データの集計処理で『On Error Resume Next』を使用し、一部のデータが文字列になっていて計算できなくても、エラーが無視されて処理が継続。

その結果、売上合計が実際よりも少なく計算されてしまい、経営判断に重大な影響を与える。

 

実際に勤めていた職場では、

『On Error Resume Next』のせいで、数か月間にわたって検査結果の合計が間違って集計されていた

ということがありました。

 

『On Error Resume Next』を使うべきではないサンプル事例がこちら

Sub 危険な売上集計()
On Error Resume Next

Dim 売上合計 As Double
Dim i As Integer

For i = 1 To 100
' 文字列データがあってもエラーを無視して処理継続
売上合計 = 売上合計 + Range("A" & i).Value
Next i

' 実際の合計よりも少ない金額が表示される危険性
MsgBox "売上合計: " & 売上合計 & "円"
End Sub

 

このようなケースでは、

集計結果が本当にあっているのかをチェックするマクロを組み込む。

エラーを無視するのでなく、適切に処理するマクロを組み込む。

などの工夫が必要です。

 

デバッグが困難になる3つの理由

『On Error Resume Next』を使用するとデバッグが困難になる理由は3つあります。

 

1つ目は、エラーが発生した箇所が特定しにくくなることです。通常のエラーであれば、エラーが発生した行が明確に示されますが、Resume Nextではエラーが無視されるため、どこで問題が発生したのかわからなくなります。

 

2つ目は、変数の値が予期しない状態になることです。エラーが発生した処理の結果、変数に正しい値が設定されない場合があります。

 

3つ目は、連鎖的なエラーが発生する可能性です。最初のエラーが無視されることで、後続の処理でさらなるエラーが発生し、問題の根本原因がわからなくなってしまいます。

 

デバックを難しくしているサンプル事例がこちら

Sub デバッグ困難な例()
On Error Resume Next

Dim ファイル名 As String
Dim ワークブック As Workbook

ファイル名 = "存在しないファイル.xlsx"
Set ワークブック = Workbooks.Open(ファイル名) ' エラーが無視される

' ワークブックがNothingのまま処理が継続され、さらなるエラーの原因となる
ワークブック.Worksheets(1).Range("A1").Value = "テスト"
End Sub

 

『On Error Resume Next』を使わなければ、

ファイルが見つからない場合、7行目のコードでエラーが発生し処理が中断

されます。

 

ですが、

 

上記のコードでは、

ファイルが見つからない場合でも処理が最後まで継続され正常に処理が完了した

と感じてしまいます。

 

このような状況を避けるため、『On Error Resume Next』を使用する際は、Errオブジェクトを使用してエラーの発生を適切に確認することが重要です。

 

関連記事「デバックのやり方」では、VBA初心者でもできる効率的なデバックのやり方をご紹介しています。

 

 VBAを設定したけどエラーが発生して思い通りに動作しない こんな問題を『デバック』で解決します。 私はエクセル業務の効率をアップさせるために、エクセル作業を自動化するVBAをいくつも開発してきました。 そこで問題となるのは、VBAを実行したらエラーが発生して作業が中断されてしまうことです。 疲れ果てた人なぜエラーが出るの?どこが間違ってるかわからない。。。 このようにお困りの方は、本記事で解説する『デバックのテクニック』を参考にしてみてください。 難しいと思われがちなVBA...
【VBAのデバック方法】初心者でも5分で解決するテクニックをご紹介 - mamemametochan.com

 

エラーの発生しない安全なマクロを作成するために、『On Error Resume Next』と併せてデバックの方法を確認しておきましょう。

 

重大なエラーを無視してしまう具体的なパターン

『On Error Resume Next』によって無視されがちな重大なエラーには特定のパターンがあります。

 

最も危険なのは、

ファイルの読み書きエラー

です。

 

ファイルが存在しない、アクセス権限がない、ディスク容量が不足しているなどの理由でファイル操作が失敗しても、エラーが無視されるため、データの保存や読み込みが正常に行われない可能性があります。

また、

オブジェクトの参照エラーも重要な問題

です。

 

存在しないワークシートやセル範囲を参照しようとした場合、エラーが無視されることで、間違ったデータを操作してしまう危険性があります。

 

重大なエラーを無視してしまうサンプル事例がこちら

Sub 重大エラー無視の例()
On Error Resume Next

' ファイル保存エラーが無視される危険性
ActiveWorkbook.SaveAs "C:\重要なデータ.xlsx"

' 存在しないワークシート参照エラーが無視される
Worksheets("存在しないシート").Range("A1").Value = "重要なデータ"

' メモリ不足エラーも無視される可能性
Dim 大きな配列(1 To 10000000) As String

MsgBox "処理完了" ' 実際には処理が失敗していても表示される
End Sub

 

これらのエラーは、システムの信頼性やデータの整合性に直接影響するため、適切なエラーハンドリングが必要です。

 

Resume Nextを安全に使うための5つの実践テクニック

『On Error Resume Next』を安全に使用するためには、

単純にエラーを無視するのではなく、適切な制御と監視の仕組みを組み合わせること

が重要です。

 

エラーの発生状況を把握し、必要に応じて適切な対処を行うための工夫を実装することで、

エラー無視の利便性を保ちながら、システムの安全性と信頼性を確保

することができます。

 

エラー発生回数をカウントして管理する方法

エラー無視を使用する際の基本的な安全対策は、

エラーの発生回数をカウントして管理すること

です。

 

エラーカウントの仕組みを実装することで、

異常に多くのエラーが発生した場合に警告を表示する、処理を中断する、

という処理が可能です。

 

エラーの発生頻度を把握できればデータの信頼性の確認することができます。

 

この方法は、大量データの処理や一括処理において有効なので自由に使えるようにしておきましょう。

 

エラーをカウントするサンプルコードがこちら

Sub エラーカウント付き処理()
On Error Resume Next

Dim エラー回数 As Integer
Dim 処理件数 As Integer
Dim i As Integer

エラー回数 = 0
処理件数 = 100

For i = 1 To 処理件数
Err.Clear ' エラー情報をクリア

' エラーが発生する可能性のある処理
Range("C" & i).Value = Range("A" & i).Value / Range("B" & i).Value

' エラー発生をチェック
If Err.Number <> 0 Then
エラー回数 = エラー回数 + 1
End If
Next i

On Error GoTo 0

' 結果レポート
MsgBox "処理完了" & vbCrLf & _
"総件数: " & 処理件数 & vbCrLf & _
"エラー件数: " & エラー回数 & vbCrLf & _
"成功率: " & Format((処理件数 - エラー回数) / 処理件数, "0.0%")
End Sub

 

このようにエラー発生状況を数値化することで、処理の品質を客観的に評価でき、改善点を特定しやすくなります。

 

Errオブジェクトでエラー内容を確認する手順

『On Error Resume Next』を使用する際は、

Errオブジェクトを活用してエラーの詳細情報を確認すること

が重要です。

 

Errオブジェクトには、エラー番号、エラーメッセージ、エラーが発生したソースなどの情報が含まれており、これらの情報を活用することで、エラーの種類に応じた適切な対処を行うことができます。

 

特に、予期しないエラーが発生した場合や、特定の種類のエラーのみを無視したい場合には、Errオブジェクトによる条件分岐が有効です。

この方法により、エラー無視の範囲を適切に制限できます。

 

Errオブジェクトを使ったサンプルコードがこちら

Sub エラー内容確認付き処理()
On Error Resume Next

Dim ファイルパス As String
Dim ワークブック As Workbook

ファイルパス = "C:\テストファイル.xlsx"
Set ワークブック = Workbooks.Open(ファイルパス)

' エラー内容を詳細に確認
If Err.Number <> 0 Then
Select Case Err.Number
Case 1004 ' ファイルが見つからない
MsgBox "ファイルが存在しません: " & ファイルパス
Case 1015 ' ファイルが使用中
MsgBox "ファイルが他のプロセスで使用されています"
Case Else
MsgBox "予期しないエラーが発生しました" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"エラー内容: " & Err.Description
End Select

' エラー情報をクリア
Err.Clear
Exit Sub
End If

' 正常処理
ワークブック.Worksheets(1).Range("A1").Value = "処理成功"
ワークブック.Save
ワークブック.Close

On Error GoTo 0
End Sub

 

このように、エラーの種類に応じて適切な対処を行うことで、Resume Nextの安全性を大幅に向上させることができます。

 

On Error GoTo 0でエラー無視を適切に解除するタイミング

『On Error Resume Next』の効果は、

明示的に解除するまで継続されるため、適切なタイミングでエラー処理を元に戻すこと

が重要です。

 

『On Error GoTo 0』は、

現在のエラー処理設定を解除し、通常のエラー処理に戻す命令

です。

 

一般的には、

エラー無視が必要な処理が完了した直後に使用し、その後の処理では通常のエラー処理が行われる

ようにします。

 

これにより、エラー無視の影響範囲を最小限に抑え、予期しない箇所でエラーが無視されることを防ぐことが可能。

 

『On Error Resume Next』と『On Error GoTo 0』を使ったサンプルコードがこちら

Sub 適切なエラー処理解除()
' 通常の処理(エラーがあれば停止)
Range("A1").Value = "開始"

' エラー無視が必要な部分のみ限定
On Error Resume Next

' 存在するかわからない図形を削除
ActiveSheet.Shapes("一時的な図形").Delete

' エラー無視を即座に解除
On Error GoTo 0

' 再び通常のエラー処理に戻る
Range("A2").Value = "図形削除処理完了"

' この時点でエラーがあれば正常に停止する
Range("A3").Value = Range("B3").Value / Range("C3").Value
End Sub

 

12行目のコードでエラー無視をリセットしています。

 

エラー無視の範囲を明確に区切ることで、コードの安全性と可読性の両方を向上させることが可能。

 

処理結果をログ出力して安全性を確保

『On Error Resume Next』を使用する場合、

ログ出力によるトレーサビリティの確保

が重要です。

 

処理の開始時刻、終了時刻、処理件数、エラー発生件数、エラーの詳細などをログファイルに記録することで、後から処理結果を検証できます。

 

特に、定期的に実行されるバッチ処理や、重要なデータを扱う処理では、詳細なログ出力が必須です。

ログファイルは、問題が発生した際の原因調査や、処理の改善点を特定するための重要な情報源となります。

 

処理結果をログ出力するサンプルコードがこちら

Sub ログ出力付き処理()
On Error Resume Next

Dim ログファイル As String
Dim 処理開始時刻 As Date
Dim エラー回数 As Integer
Dim 処理件数 As Integer

ログファイル = "C:\ログ\処理ログ_" & Format(Now, "yyyymmdd") & ".txt"
処理開始時刻 = Now
エラー回数 = 0
処理件数 = 10

' ログファイルに開始記録
Open ログファイル For Append As #1
Print #1, Format(処理開始時刻, "yyyy/mm/dd hh:mm:ss") & " - 処理開始"

' メイン処理
Dim i As Integer
For i = 1 To 処理件数
Err.Clear

' エラーが発生する可能性のある処理
Range("C" & i).Value = Range("A" & i).Value * Range("B" & i).Value

If Err.Number <> 0 Then
エラー回数 = エラー回数 + 1
Print #1, Format(Now, "yyyy/mm/dd hh:mm:ss") & " - エラー発生 行:" & i & " 内容:" & Err.Description
End If
Next i

' 完了記録
Print #1, Format(Now, "yyyy/mm/dd hh:mm:ss") & " - 処理完了 件数:" & 処理件数 & " エラー:" & エラー回数
Close #1

On Error GoTo 0

MsgBox "処理完了しました。詳細はログファイルをご確認ください。"
End Sub

 

このようなログ出力により、処理の透明性を確保し、問題が発生した際の迅速な対応が可能になります。

 

条件分岐でエラー無視の範囲を限定する書き方

『On Error Resume Next』の安全性を高めるもう一つの重要なテクニックは、

条件分岐を使用してエラー無視の範囲を適切に限定すること

です。

 

すべてのエラーを無視するのではなく、特定の条件下でのみエラー無視を適用することで、予期しないエラーを見逃すリスクを大幅に削減できます。

 

たとえば、

ファイルの存在確認、オブジェクトの存在確認、特定の範囲内でのみエラー無視を適用するなど、

用途に応じた制限を設けることが重要です。

 

この方法により、エラー無視の利便性を保ちながら、システムの安全性を確保できます。

 

条件分岐と『On Error Resume Next』を組み合わせたサンプルコードがこちら

Sub 条件付きエラー無視()
Dim ファイル名 As String
Dim 処理対象 As Boolean

ファイル名 = "オプションファイル.xlsx"

' ファイル存在確認のみエラー無視
On Error Resume Next
処理対象 = (Dir(ファイル名) <> "")
On Error GoTo 0

' 条件に応じた処理分岐
If 処理対象 Then
' ファイルが存在する場合の処理
On Error GoTo ErrorHandler

Dim wb As Workbook
Set wb = Workbooks.Open(ファイル名)

' 通常のエラー処理で安全に実行
wb.Worksheets(1).Range("A1").Value = "処理日時: " & Now
wb.Save
wb.Close

MsgBox "オプションファイルの処理が完了しました"
Else
' ファイルが存在しない場合はスキップ
MsgBox "オプションファイルが見つかりません。処理をスキップします。"
End If

Exit Sub

ErrorHandler:
MsgBox "ファイル処理中にエラーが発生しました: " & Err.Description
If Not wb Is Nothing Then
wb.Close SaveChanges:=False
End If
End Sub

 

このように、エラー無視を必要最小限の範囲に限定することで、コードの安全性と保守性を両立させることができます。

 

VBA初心者が安定した業務効率化マクロを導入する方法

 

VBAなんて扱ったことないけど、業務内容に合わせた安定したマクロを導入したい!

 

こんな問題を解決する方法がこちら

 

VBAスキルを身に着ける前は、「マクロ開発の外注」で対応していましたが、

今では自分で効率化マクロをサクッと導入しちゃいます。

 

完成されたマクロを使ってエクセル業務を処理する

作業効率が2倍以上アップ!!

便利すぎて自分でもマクロを設定したいと考え始める

参考書やネットの情報でVBAスキルを身に付ける

マクロ開発を代行できる程のスキルを習得

 

 

VBAは

他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい

という特徴があります。

 

外注した方が楽だけど、費用がかかる。自分で導入すれば費用は0円だけど時間がかかる。。

いずれにせよ、効率化マクロを導入できれば作業効率が飛躍的にアップするのは間違いありません。

 

あなたに合った方法で導入しちゃいましょう。

 

マクロ開発を外注に依頼する

マクロ開発を外注に依頼する方法は

VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法

です。

 

「こんなデータ抽出作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」

こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。

 

しかも、

 

エラーが発生しないマクロであれば半永久的に利用できる

というメリットがあります。

 

 

ガッツポーズの人

半永久的に使い続けられるのは嬉しい

 

 

デメリットは、費用がかかることだけ。

開発内容、依頼先によってかかる費用は大きく異なります。

私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。

 

疑問がある人

ちょっと高くない。。。

 

ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。

開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、

費用が安い!スピード納期!!

でやらせてもらっています。

 

ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。

 

ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。

 

 

 

参考書やネットでVBAスキルを身に付ける

先程も紹介しましたが、

VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい

プログラミングです。

 

言い換えると、

情報量が豊富なので自分で勉強できちゃう

ということです。

 

私のVBAスキルはほとんど独学で身に付けたもので、

考えた処理のほとんどをVBAで表現できるレベルにまで到達した!

と思っています。

 

私の作ったマクロをプロのプログラマーが見れば、

お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!

と感じるはずです。

 

でも、

私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?

 

独学であっても、エラーが発生しないマクロを開発できるようになれます。

 

独学でVBAスキルを身に付けるコツは、

エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる

です。

 

とは言っても、全くの知識0の方は何をすればいいかわからないですよね。

 

VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】』を読んでみてください。

 

VBAの知識0の方でもすいすい読み進められる内容になっています。

やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。

 

実際に私はこの参考書を読んでからVBAの勉強を始めました。

 

ひらめく人

VBA学習スタートのきっかけをくれた参考書


 

 

VBAの魅力を発見した後は、

ひたすら自動化したい内容のコードを書くだけ

です。

 

【VBA エラー無視】【VBA エラー処理】でネット検索すれば知りたいコードをすぐにゲットできます。

 

実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると

自然といろんなマクロが作れるようになっているはずです。

 

VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。

 

モバイルバージョンを終了