VBAを使ったマクロ開発では、想定外のエラーが発生することが珍しくありません。たとえば、存在しないシート名を指定したり、ファイルのパスが間違っていたりすると、処理が途中で止まってしまうこともあります。そんなときに役立つのが「エラー処理」です。この記事では、VBAのエラー処理の基本文法から、実務でもよく使うテクニックまでを、わかりやすく解説します。これを読むことで、あなたのVBAコードがより安定し、信頼性の高いものになるでしょう。
On Error文とは?エラー処理の基本構文
VBAでエラー処理を行う際に必ず登場するのが On Error
文です。主に以下の3つの形式があります。
On Error Resume Next
エラーが発生しても処理を止めずに、次の行へ進みます。
On Error Resume Next
' 以降、エラーが発生しても止まらない
使用例:
On Error Resume Next
Workbooks.Open "C:\存在しないファイル.xlsx"
If Err.Number <> 0 Then
MsgBox "ファイルが開けませんでした。"
Err.Clear
End If
On Error GoTo ラベル
エラーが発生した場合、指定したラベルへジャンプします。
On Error GoTo ErrorHandler
' 処理本体
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & Err.Description
On Error GoTo 0
エラー処理を解除して、通常のエラー表示に戻します。
On Error GoTo 0
Errオブジェクトを理解しよう
VBAでは、エラー情報を取得するために Err
オブジェクトを使います。主なプロパティは次の通りです。
プロパティ | 説明 |
---|---|
Err.Number | エラー番号 |
Err.Description | エラー内容の説明 |
Err.Source | エラーを発生させたオブジェクト名 |
Err.Clear | エラー情報をリセットするメソッド |
例:
If Err.Number <> 0 Then
MsgBox "エラー番号: " & Err.Number & vbCrLf & "内容: " & Err.Description
Err.Clear
End If
よくあるエラーと対処例
ファイルが存在しない
On Error Resume Next
Open "C:\test.txt" For Input As #1
If Err.Number <> 0 Then
MsgBox "ファイルが見つかりません。"
Err.Clear
End If
シートが存在しない
On Error Resume Next
Set ws = Worksheets("Data")
If ws Is Nothing Then
MsgBox "シートが存在しません。"
Err.Clear
End If
セルへの数値変換でエラー
On Error Resume Next
val = CInt(Range("A1").Value)
If Err.Number <> 0 Then
MsgBox "数値に変換できません。"
Err.Clear
End If
エラー処理のベストプラクティス
1. Resume Nextは必要最低限に
すべての処理で Resume Next
を使うと、エラーに気づかず重大なバグにつながる可能性があります。ポイントとなる処理だけに限定しましょう。
2. エラーログを記録する
エラー内容をログとして記録しておくことで、あとで原因分析がしやすくなります。
Sub SampleLog()
On Error GoTo ErrorHandler
' 処理本体
Debug.Print 1 / 0 ' わざとエラーを発生
Exit Sub
ErrorHandler:
Open "C:\error_log.txt" For Append As #1
Print #1, Now & " エラー: " & Err.Description
Close #1
Err.Clear
End Sub
3. エラー後は必ず処理を抜けるようにする
Exit Sub
や Exit Function
を使って、エラー後に無関係な処理が走らないようにしましょう。
Select Caseでエラー番号ごとに処理を分ける
より細かいエラー対応が必要な場合は、エラー番号を条件分岐するのも効果的です。
On Error GoTo ErrHandler
' 処理本体
Exit Sub
ErrHandler:
Select Case Err.Number
Case 9 ' インデックスの範囲外
MsgBox "存在しないシートを参照しました。"
Case 1004
MsgBox "Excelの操作に関するエラーです。"
Case Else
MsgBox "その他のエラー: " & Err.Description
End Select
Err.Clear
Functionでエラー処理する場合の注意点
関数内でエラーが出ると、戻り値をうまく返せない場合があります。そのため、以下のようにエラー時の戻り値を明示しておくと安心です。
Function Divide(ByVal x As Double, ByVal y As Double) As Variant
On Error GoTo ErrHandler
Divide = x / y
Exit Function
ErrHandler:
Divide = "エラー: " & Err.Description
End Function
最後に:VBAの安定運用にはエラー処理が不可欠
VBAを活用する上で、エラー処理は「保険」のような存在です。どんなに丁寧にコーディングしても、予期しないエラーは起きてしまいます。だからこそ、適切なエラー処理を書くことで、ユーザーにとっても開発者にとっても安心できるマクロが実現できます。
まずは On Error GoTo
と Err
オブジェクトを使いこなすところから始め、少しずつログ記録や条件分岐などの応用にもチャレンジしてみてください。