VBA初心者必見!エラー処理の基本から実践テクニックまで徹底解説

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 SubExit 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 GoToErr オブジェクトを使いこなすところから始め、少しずつログ記録や条件分岐などの応用にもチャレンジしてみてください。

タイトルとURLをコピーしました