【VBA】エラー処理後に元の処理を再試行(リトライ)する方法 (Resume)

目次

はじめに

VBAでエラー処理を行う際、エラーをユーザーに通知してマクロを終了するだけでなく、「エラーの原因をプログラムで修正し、失敗した処理をもう一度やり直したい」という高度な制御が必要になることがあります。

例えば、「書き込み先のシートが存在しない」というエラーが発生した場合、シートを自動で作成してから、もう一度書き込み処理を試みる、といったケースです。

このような「エラー復旧と再試行(リトライ)」を実現するのが Resume というステートメントです。

この記事では、On Error GoToResume を組み合わせて、エラー発生時に問題を自動修正し、元の処理を再実行する、実践的なエラーハンドリング手法を解説します。


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 0Resume と全く同じ動作をします。
  • 今回の例では、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 を使いこなすことで、単にエラーで停止するだけでなく、ある程度の自己修復機能を備えた、非常に堅牢でユーザーフレンドリーなマクロを構築することが可能になります。

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

この記事を書いた人

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

目次