【VBA】エラーハンドリングの基本と応用コードスニペット集

VBA

Excel VBAを使用していると、ランタイムエラーに遭遇することがあります。エラーハンドリングを適切に実装することで、スムーズなプログラムの実行とトラブルシューティングが可能になります。この記事では、VBAのエラーハンドリングに関する基本から応用のコードスニペットを紹介します。


1. 基本的なエラーハンドリング

エラーが発生してもプログラムが停止しないようにする基本的なコードです。

Sub BasicErrorHandling()
    On Error Resume Next ' エラーを無視して次の行に進む
    
    ' エラーが発生する可能性のあるコード
    Dim x As Integer
    x = 1 / 0 ' 0除算でエラーが発生
    
    MsgBox "処理が完了しました。", vbInformation
End Sub

2. エラー処理後に通常フローに戻す

エラー発生後に特定の処理を行い、通常のコード実行を継続する例です。

Sub ResumeAfterError()
    On Error Resume Next
    
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("NonExistentSheet") ' 存在しないシートを参照
    
    If ws Is Nothing Then
        MsgBox "シートが見つかりませんでした。", vbExclamation
    End If
    
    On Error GoTo 0 ' エラー無視を解除
End Sub

3. 特定のエラー処理を行う(On Error GoTo)

エラーが発生した場合に特定の処理を行い、正常終了する例です。

Sub SpecificErrorHandling()
    On Error GoTo ErrorHandler
    
    ' エラーが発生する可能性のある処理
    Dim x As Integer
    x = 1 / 0
    
    Exit Sub ' 正常終了時はエラー処理をスキップ

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "エラー"
End Sub

4. エラー情報をログに記録する

エラー内容をログに記録することで、後から詳細なエラー情報を確認できます。

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

ErrorHandler:
    Dim logSheet As Worksheet
    Set logSheet = ThisWorkbook.Sheets("ErrorLog")
    
    Dim lastRow As Long
    lastRow = logSheet.Cells(logSheet.Rows.Count, 1).End(xlUp).Row + 1
    
    ' エラー情報を記録
    logSheet.Cells(lastRow, 1).Value = Now
    logSheet.Cells(lastRow, 2).Value = Err.Number
    logSheet.Cells(lastRow, 3).Value = Err.Description
    
    MsgBox "エラーが発生しました。ログに記録しました。", vbCritical
End Sub

5. 複数エラーを区別して処理する

異なるエラーに応じて異なる処理を行います。

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

ErrorHandler:
    Select Case Err.Number
        Case 11 ' 0除算エラー
            MsgBox "0で割ることはできません。", vbExclamation
        Case 9 ' インデックス範囲外エラー
            MsgBox "範囲外のセルを参照しました。", vbExclamation
        Case Else
            MsgBox "不明なエラーが発生しました: " & Err.Description, vbCritical
    End Select
End Sub

6. 最後に必ず実行される処理を追加(Finally的処理)

エラーが発生した場合でも、必ず実行される処理を追加します。

Sub AlwaysExecuteCleanup()
    On Error GoTo ErrorHandler
    
    ' 処理
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    ws.Cells(1, 1).Value = "処理中"
    
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Finally:
    ' 必ず実行される処理
    If Not ws Is Nothing Then
        ws.Cells(1, 1).Value = "処理完了(または中断)"
    End If
End Sub

注意点

  1. 適切なエラー解除
    On Error Resume Nextを使用した後は、On Error GoTo 0でエラー解除を忘れないようにしてください。
  2. ログの保存場所
    エラー情報を記録する場合、専用のシートや外部ファイルを用意すると管理が簡単です。
  3. ユーザーへのフィードバック
    エラー内容が分かりやすいメッセージを表示し、次のアクションを案内することが重要です。

この記事で紹介したエラーハンドリングのコードスニペットを活用し、安定したプログラム運用を実現してください!

コメント

タイトルとURLをコピーしました