VBA エラー制御

VBA エラートラップの基本構文

  • On Error GoTo ラベル名
    → エラー発生時に指定のラベルにジャンプ(最も一般的)
  • On Error Resume Next
    → エラーを無視して次の行に進む(慎重に使う)
  • On Error GoTo 0
    → エラー処理を解除(元に戻す)

基本的な使い方例

Sub Sample()
    On Error GoTo ErrHandler

    ' メイン処理
    Debug.Print 1 / 0 ' エラー発生

    Exit Sub

ErrHandler:
    MsgBox "エラー発生:" & Err.Number & " - " & Err.Description
End Sub

エラー処理のポイント

  • 明示的に終了するために Exit Sub(または Exit Function)を使う
  • エラー情報取得
    • Err.Number … エラー番号
    • Err.Description … エラーメッセージ
    • Err.Source … 発生元(省略可能)

実務での活用方法

  • ファイル/フォルダ操作、外部アプリ制御(Outlookなど)は子プロシージャ内で捕捉
    • → 予期しないエラーを親に影響させない
  • 内部ロジック(計算処理など)は親プロシージャで集中的に管理
    • → 処理の流れや制御を明確に
  • エラー発生時は必ずログやユーザー通知
    • → Debug.Print や MsgBox など
  • 複雑な処理は戻り値で「成功/失敗」を返す
    • → Function を使って True/False や Nothing などで結果を判定

よくあるエラー番号と意味

Err.Number内容
9インデックスが有効範囲外
13型が一致しません
53ファイルが見つかりません
1004Excelオブジェクトエラー

共通エラー処理モジュール例

' === modErrorHelper.bas ===
Option Explicit

' === ▼ 共通エラー処理 ===
Public Sub HandleStandardError(Optional ByVal procName As String = "")
    Dim msg As String
    msg = "エラーが発生しました"
    
    If procName <> "" Then msg = msg & vbCrLf & "[プロシージャ] " & procName
    msg = msg & vbCrLf & "[番号] " & Err.Number
    msg = msg & vbCrLf & "[内容] " & Err.Description & " _by mito"
    
    ' 即時ウィンドウ出力(開発中のデバッグに便利)
    Debug.Print msg
    
    ' ユーザー通知
    MsgBox msg, vbCritical
    
    ' エラー情報をクリア(次処理に影響しないように)
    Err.Clear
End Sub

' === ▼ 後始末(画面更新・イベント処理を戻す) ===
Public Sub Cleanup(Optional ByVal restoreEvents As Boolean = True)
    Application.ScreenUpdating = True
    If restoreEvents Then Application.EnableEvents = True
End Sub

======呼び出しテンプレート========
Sub Sample()
    On Error GoTo ErrHandler
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ' === ▼ メイン処理 ===
    '(ここに処理を書く)
    
ExitHandler:
    Call Cleanup
    Exit Sub

ErrHandler:
    Call HandleStandardError("Sample")
    Resume ExitHandler
End Sub

コメント