はじめに
VBAでエラー処理を行う際、エラーをユーザーに通知してマクロを終了するだけでなく、「エラーの原因をプログラムで修正し、失敗した処理をもう一度やり直したい」という高度な制御が必要になることがあります。
例えば、「書き込み先のシートが存在しない」というエラーが発生した場合、シートを自動で作成してから、もう一度書き込み処理を試みる、といったケースです。
このような「エラー復旧と再試行(リトライ)」を実現するのが Resume
というステートメントです。
この記事では、On Error GoTo
と Resume
を組み合わせて、エラー発生時に問題を自動修正し、元の処理を再実行する、実践的なエラーハンドリング手法を解説します。
Resume
を使ったエラー復旧と再試行のサンプルコード
このマクロは、「Report
」という名前のシートの B2
セルに値を書き込もうとします。もし Report
シートが存在しない場合、エラーハンドラが起動し、シートを新規作成してから、Resume
を使って元の書き込み処理を再試行します。
完成コード
' シートが存在しない場合に自動作成して処理を再試行する
Sub RetryAfterCreatingSheet()
Const TARGET_SHEET_NAME As String = "Report"
'--- エラーハンドラを設定 ---
On Error GoTo CreateSheetHandler
'--- 正常系の処理 ---
' この行で「インデックスが有効範囲にありません」(エラー番号 9) が発生する可能性がある
Worksheets(TARGET_SHEET_NAME).Range("B2").Value = "処理が完了しました。"
MsgBox "レポートシートへの書き込みが完了しました。"
Exit Sub
'--- エラー処理ブロック ---
CreateSheetHandler:
' 発生したエラーが「インデックスが有効範囲にありません」(シートが見つからない)の場合か判定
If Err.Number = 9 Then
' エラーの原因(シートがない)を修正
MsgBox "「" & TARGET_SHEET_NAME & "」シートが存在しないため、新規作成します。", vbInformation
Worksheets.Add(Before:=ThisWorkbook.Worksheets(1)).Name = TARGET_SHEET_NAME
' Resumeステートメントで、エラーが発生した行から処理を再開
Resume
Else
' その他の予期せぬエラーの場合
MsgBox "予期せぬエラーが発生しました。処理を中断します。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"エラー内容: " & Err.Description, vbCritical, "エラー"
' Resume せずにそのまま終了
End If
End Sub
コードの解説
Resume
ステートメント
これが、処理を再試行させるための核心部分です。
Resume
: エラー処理ブロックの最後にこのステートメントを記述すると、プログラムの実行はエラーを発生させた行にジャンプして戻り、その行の処理をもう一度実行します。Resume 0
もResume
と全く同じ動作をします。- 今回の例では、
Worksheets(TARGET_SHEET_NAME).Range("B2").Value = ...
の行でエラーが発生すると、エラーハンドラでシートが作成され、Resume
によって、再び同じ行のWorksheets(...)
から処理が再開されます。今度はシートが存在するため、処理は成功します。
Resume Next
との違い
よく似たステートメントに Resume Next
があります。
Resume
: エラーが発生したその行から再開。Resume Next
: エラーが発生した行の次の行から再開。
「エラーを無視して次に進む」On Error Resume Next
と似たような動作を、On Error GoTo
の枠組みの中で実現したい場合に使います。
まとめ
今回は、Resume
ステートメントを使って、エラー処理後に元の処理を再試行する高度なエラーハンドリングを解説しました。
- エラーハンドラ内でエラーの原因をプログラム的に解決できる場合がある。
Resume
を使うと、エラーを発生させた行に戻って処理を再試行できる。Resume Next
を使うと、エラーが発生した行の次の行から処理を再開できる。
この Resume
を使いこなすことで、単にエラーで停止するだけでなく、ある程度の自己修復機能を備えた、非常に堅牢でユーザーフレンドリーなマクロを構築することが可能になります。