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 | ファイルが見つかりません |
1004 | Excelオブジェクトエラー |
共通エラー処理モジュール例
' === 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
コメント