はじめに
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
は、正しく使えば非常に便利なステートメントですが、無計画に使うとバグの温床になります。その効果が及ぶ範囲を常に意識し、限定的に利用するようにしましょう。