■ エラーハンドリングの必要性とは?
VBAでは、エラーが発生するとマクロは停止し、「実行時エラー ‘番号’: ○○」というダイアログが表示されます。業務で使うマクロでこのような事態が起きると、作業が中断され大きなトラブルにつながることがあります。
そのため、「エラーが発生しても中断させず、安全に処理を続行または終了させる」仕組みが重要です。
■ 基本構文:On Error ステートメント
1. On Error Resume Next
On Error Resume Next
- エラーが発生しても無視して次の行に進む
- エラー内容を
Err
オブジェクトで取得して処理する必要がある
2. On Error GoTo ラベル名
On Error GoTo ErrorHandler
- エラーが発生すると、指定したジャンプ先のラベル(ErrorHandler)に処理を移す
■ On Error Resume Next の使用例
Sub ファイル削除()
Dim filePath As String
filePath = "C:\Test\sample.txt"
On Error Resume Next
Kill filePath
If Err.Number <> 0 Then
MsgBox "エラー発生:" & Err.Description
Err.Clear
Else
MsgBox "ファイルを削除しました"
End If
End Sub
Kill
関数で削除しようとしてエラーが出た場合でも、次に進む
Err.Number
でエラーの有無を確認
■ On Error GoTo の使用例
Sub 安全な割り算()
On Error GoTo エラー処理
Dim x As Double, y As Double, result As Double
x = 100
y = 0 ' 0 で割ろうとする
result = x / y
MsgBox "結果は " & result
Exit Sub
エラー処理:
MsgBox "エラーが発生しました:" & Err.Description
Err.Clear
End Sub
GoTo
により、エラー処理用ラベルへジャンプ
Exit Sub
を使って正常処理時にエラー処理をスキップ
■ Err オブジェクトのプロパティ
プロパティ | 説明 |
---|
Err.Number | エラー番号(0はエラーなし) |
Err.Description | エラーの内容説明 |
Err.Source | エラーの発生元 |
Err.Clear | エラー情報をクリア(リセット) |
■ エラーハンドリングのテンプレート
Sub エラーハンドリングテンプレート()
On Error GoTo ErrorHandler
' 通常の処理
MsgBox "ここまで正常に処理されました"
Exit Sub
ErrorHandler:
MsgBox "エラー発生:" & Err.Number & vbCrLf & Err.Description
Err.Clear
End Sub
■ 応用:特定エラーのみ処理する
Sub 特定エラー処理()
On Error GoTo ErrorHandler
Dim x As Integer
x = 1 / 0 ' エラー(ゼロ除算)
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 11
MsgBox "ゼロ除算が発生しました"
Case Else
MsgBox "その他のエラー:" & Err.Description
End Select
Err.Clear
End Sub
■ エラーハンドリングの注意点
注意点 | 解説 |
---|
Err.Clear は必ず実行 | エラー情報をリセットしないと、次の処理に影響する |
On Error Resume Next は濫用禁止 | 本当に必要な箇所に限定すべき(原因不明のバグの温床になる) |
Exit Sub/Function を使う | 正常処理とエラー処理を明確に分けるために使う |
On Error GoTo 0 で無効化可能 | Resume Next の後に通常動作に戻すにはこれを使う |
■ Resume の違いについて
ステートメント | 説明 |
---|
Resume | エラーが発生した元の行に戻って再実行する(危険) |
Resume Next | エラーの次の行から再開する |
Resume [ラベル名] | 任意の行にジャンプして再開(通常のGoToと同様) |
■ 実用例:フォルダ作成時のエラーハンドリング
Sub フォルダ作成_安全版()
On Error GoTo ErrorHandler
Dim folderPath As String
folderPath = "C:\Temp\TestFolder"
If Dir(folderPath, vbDirectory) = "" Then
MkDir folderPath
End If
MsgBox "処理が正常に終了しました"
Exit Sub
ErrorHandler:
MsgBox "エラー:" & Err.Number & vbCrLf & Err.Description
Err.Clear
End Sub
■ まとめ
項目 | 内容 |
---|
基本命令 | On Error Resume Next / On Error GoTo ラベル |
エラー情報取得 | Err.Number , Err.Description , Err.Source |
処理分岐 | Select Case Err.Number でエラー種別ごとに分ける |
エラー後の動作制御 | Resume , Resume Next , Exit Sub の使い分け |
安全なコーディング法 | 正常処理とエラー処理を明確に分離し、Err.Clear で後処理を整える |