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
注意点
- 適切なエラー解除
On Error Resume Next
を使用した後は、On Error GoTo 0
でエラー解除を忘れないようにしてください。 - ログの保存場所
エラー情報を記録する場合、専用のシートや外部ファイルを用意すると管理が簡単です。 - ユーザーへのフィードバック
エラー内容が分かりやすいメッセージを表示し、次のアクションを案内することが重要です。
この記事で紹介したエラーハンドリングのコードスニペットを活用し、安定したプログラム運用を実現してください!
コメント