【VBA】エラーを無視して処理を続行する On Error Resume Next の使い方と注意点

目次

はじめに

VBAマクロの実行中にエラーが発生すると、通常はプログラムが停止してしまいます。しかし、時には「この処理でエラーが起きても問題ないので、無視して次の行に進んでほしい」という場面があります。

その代表例が、「マクロの最初に、前回作成したレポートシートを削除する」という処理です。初めてマクロを実行するとき、そのシートはまだ存在しないため、削除しようとするとエラーになります。

このような「発生しても問題ないエラー」を意図的に無視させるのが On Error Resume Next というステートメントです。

この記事では、On Error Resume Next の基本的な使い方と、安全に利用するための重要な注意点を解説します。


On Error Resume Next を使ったサンプルコード

このマクロは、まず「Summary」という名前のシートが存在すれば削除し、その後、新しい Summary シートを先頭に作成します。もし最初に Summary シートが存在しなくても、エラーで停止することなく処理が続行されます。

完成コード

' 「Summary」シートを初期化(あれば削除し、なければ新規作成)する
Sub InitializeSummarySheet()

    '--- 1. シート削除時の確認メッセージを非表示にする ---
    Application.DisplayAlerts = False
    
    '--- 2. これ以降のエラーを無視するように設定 ---
    On Error Resume Next
    
    '--- 3. エラーが発生する可能性のある処理 ---
    ' "Summary"シートが存在しない場合、この行でエラーが発生するが、無視される
    ThisWorkbook.Worksheets("Summary").Delete
    
    '--- 4. エラーハンドリングを通常の状態に戻す ---
    ' この行が非常に重要!
    On Error GoTo 0
    
    '--- 5. 確認メッセージを再表示する設定に戻す ---
    Application.DisplayAlerts = True
    
    '--- 6. 新しいシートを追加して名前を変更 ---
    Worksheets.Add(Before:=ThisWorkbook.Worksheets(1)).Name = "Summary"
    
    MsgBox "「Summary」シートを初期化しました。"

End Sub

コードの解説

Application.DisplayAlerts = False

シートを削除する際には、「削除しますか?」という確認のダイアログが表示されます。Application.DisplayAlerts = False は、このようなExcelからの確認メッセージを一時的に非表示にするための命令です。処理が終わったら、必ず True に戻しましょう。

On Error Resume Next

この一行が、エラーを無視させるための宣言です。VBAは、この行以降で実行時エラーが発生してもプログラムを停止せず、エラーが起きた行の次の行から、何事もなかったかのように処理を続行します。

On Error GoTo 0

これが On Error Resume Next を使う上で最も重要な作法です。 On Error Resume Next の効果は、On Error GoTo 0 で解除するか、プロシージャが終了するまで継続します。もし解除し忘れると、その後のコードで発生した予期せぬ重大なエラーまで、すべて無視されてしまいます

これにより、バグの原因究明が非常に困難になるため、エラーを無視したい処理が終わったら、直ちに On Error GoTo 0 を記述して、VBAの通常のエラー処理状態に戻すことが強く推奨されます。


まとめ

今回は、On Error Resume Next を使って、特定のエラーを意図的に無視する方法を解説しました。

  • On Error Resume Next: エラーが発生しても、次の行から処理を続行する。
  • On Error GoTo 0: エラーを無視する設定を解除し、通常の状態に戻す。この2つは必ずセットで使う
  • エラーを無視する範囲は、必要最小限に留めることが重要。

On Error Resume Next は、正しく使えば非常に便利なステートメントですが、無計画に使うとバグの温床になります。その効果が及ぶ範囲を常に意識し、限定的に利用するようにしましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次