VBA エラー回避

■ エラーハンドリングの必要性とは?

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 で後処理を整える
タイトルとURLをコピーしました