VBAのResumeでエラーハンドリングを制御する方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

Resumeの概要

エラーハンドリング VBAの予約語

Resume

概要 Resume は、VBAでエラーハンドリングの処理を制御するために使用されます。エラーが発生した後に、指定した場所から処理を再開できます。

わかりやすく説明 Resume は、「エラーが起きたけど、どこから処理を続けるか決めるよ!」という命令です。エラーが発生しても、適切な場所から再開することができます。

  • エラー処理後にプログラムの実行を再開する。
  • Resume でエラーが発生した行からやり直す。
  • Resume Next で次の行から再開する。
  • Resume [ラベル] で特定の場所から再開する。

Resume の基本的な使い方

Resume を使って、エラーが発生した行から処理を再開する基本的な例です。

Sub ErrorHandlingExample()
    On Error GoTo ErrorHandler
    
    ' エラーが発生する可能性のある処理
    Dim x As Integer
    x = 10 / 0 ' ここでエラー発生
    
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbExclamation, "エラー"
    Resume ' エラーが発生した行から再開
End Sub

解説:

  • On Error GoTo ErrorHandler でエラー時にエラーハンドラへ移動。
  • エラーが発生すると ErrorHandler にジャンプし、メッセージを表示。
  • Resume を実行すると、エラーが発生した行(x = 10 / 0)から再開するため、再びエラーが発生する。

Resume Next を使ってエラーをスキップする

Resume Next を使うと、エラーが発生しても次の行から処理を続行できます。

Sub ResumeNextExample()
    On Error Resume Next
    
    ' エラーが発生してもスキップして次の行へ
    Dim x As Integer
    x = 10 / 0 ' エラー発生 → スキップ
    
    MsgBox "処理が続行されました", vbInformation, "Resume Next"
End Sub

解説:

  • On Error Resume Next を使うと、エラーが発生しても次の行から処理を続行する。
  • エラー処理をせずに続行するため、意図しない結果になる可能性がある。

Resume [ラベル] を使って特定の場所から再開

Resume にラベルを指定すると、特定の行から処理を再開できます。

Sub ResumeLabelExample()
    On Error GoTo ErrorHandler
    
    Dim x As Integer
    x = 10 / 0 ' ここでエラー発生
    
    Exit Sub

ErrorHandler:
    MsgBox "エラー発生: " & Err.Description, vbExclamation, "エラー"
    Resume ContinueHere ' 指定した行から処理を再開
    
ContinueHere:
    MsgBox "エラー後の処理を実行", vbInformation, "処理継続"
End Sub

解説:

  • エラーが発生すると ErrorHandler にジャンプ。
  • Resume ContinueHereContinueHere: から処理を再開。

ExcelでのResumeの活用例(セル値を安全に取得)

Excelのセルデータを取得する際に、エラーを回避しながら処理を続行する例です。

Sub SafeReadCell()
    On Error Resume Next
    
    Dim value As Variant
    value = Cells(1, 1).Value ' A1の値を取得
    
    If Err.Number <> 0 Then
        MsgBox "エラーが発生しました: " & Err.Description, vbExclamation, "エラー"
        Err.Clear
    Else
        MsgBox "取得した値: " & value, vbInformation, "成功"
    End If
End Sub

解説:

  • On Error Resume Next を使い、セルの取得時にエラーが発生しても処理を続行。
  • エラーが発生した場合、メッセージを表示し、Err.Clear でエラーをクリア。

エラーを回避する方法

Resume を使う際に、無限ループや意図しないエラー再発を防ぐため、適切な処理を追加します。

Sub SafeResume()
    On Error GoTo ErrorHandler
    
    Dim x As Integer
    x = 10 / 0 ' ここでエラー発生
    
    Exit Sub

ErrorHandler:
    MsgBox "エラー発生: " & Err.Description, vbExclamation, "エラー"
    
    ' エラーが繰り返し発生しないよう、Resume の代わりに Exit Sub
    Exit Sub
End Sub

解説:

  • Resume でエラー行から再開すると、再びエラーが発生する可能性があるため、Exit Sub を使って処理を終了するのも一つの方法。

Resume の注意事項

  • Resume の使い方を間違えると無限ループになる: エラーが発生した行から再開すると、再びエラーが発生する可能性がある。
  • Resume Next はエラーを無視する: 必要なエラー処理を行わないと、問題が発生しても気づかない可能性がある。
  • Resume ラベル を使うと柔軟なエラーハンドリングが可能: エラー発生後に適切な処理を続行できる。

よくある質問

Q: Resume を使うとエラーが再発するのはなぜですか?
A: Resume はエラーが発生した行から処理を再開するため、同じエラーが再び発生する可能性があります。
Q: Resume Next を使うと問題は発生しませんか?
A: Resume Next はエラーを無視するため、意図しないバグを見逃す可能性があります。適切にエラーチェックを行う必要があります。
Q: Resume を標準モジュール以外でも使えますか?
A: はい。クラスモジュールやワークシートモジュールでも使用できます。
Q: Resume の代わりに Exit Sub を使うのは適切ですか?
A: はい。エラーが再発する可能性がある場合は、処理を中断するために Exit Sub を使うのが適切です。

まとめ

  • Resume はエラー処理後にプログラムの実行を制御するために使用される。
  • Resume はエラーが発生した行から再開するため、無限ループに注意が必要。
  • Resume Next を使うとエラーを無視して処理を続行できるが、慎重に使用する必要がある。
  • Resume [ラベル] を指定すると、エラー処理後に特定の場所から再開できる。
  • 適切なエラーハンドリングを行い、意図しないエラーの再発を防ぐことが重要。