みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでマクロの動作状況をログファイルに出力する方法についてシリーズでお伝えしています。
前回の記事はこちらでした。
ログを書き出すファイルが存在するか否かを判定して、なければファイルを新規作成する方法についてお伝えしました。
今回は、エクセルVBAでエラーが発生したときにそのエラーの内容をログファイルに書き出すプログラムを紹介します。
では、いってみましょう!
ログの書き出しについてのおさらい
前回作成したプログラムなのですが、少し改良して引数を受け取る形にしてみました。
Sub writeLog(ByVal strMsg As String)
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
Dim strPath As String
strPath = ThisWorkbook.Path & "\error.log"
With objFso
If Not .FileExists(strPath) Then
.CreateTextFile (strPath)
End If
With .OpenTextFile(strPath, 8) '8:ForAppending
.WriteLine strMsg
.Close
End With
End With
Set objFso = Nothing
End Sub
引数を渡してwriteLogを呼び出すことで、error.logにログが追加されるというわけです。
便利そうでよね。
では、これを応用してエラーメッセージをログに書き出す方法をお伝えしていきます。
エラーが発生したらエラー処理ルーチンに飛ぶ
エクセルVBAではエラーが発生した際に、エラーが発生したとき用の処理にジャンプさせることができます。
On Errorステートメントを使いますね。
この場合、使い方としてはGotoステートメントと組み合わせて
‘色々な処理
ラベル名:
‘エラー時の処理
とします。On Errorステートメントを記述した箇所以降でエラーが発生したら、その時点でラベル名の位置に処理が移動し、エラー時の処理が実行されます。
「色々な処理」の最後にExit Subを入れるの忘れないように。いつでもエラー時の処理が実行されてしまいますから…。
さて、使用例としては以下のようなプログラムですね。
Sub calcUnitPrice()
On Error GoTo Err_line
'***** 計算処理 *****
Dim i As Long 'イテレータ
i = 2
With Sheet1
Do While .Cells(i, 1).Value <> ""
'C列D列で除算して、E列に結果を表示する
.Cells(i, 4).Value = .Cells(i, 2).Value / .Cells(i, 3).Value
i = i + 1
Loop
End With
Exit Sub
'***** エラー処理 *****
Err_line:
MsgBox "エラーが発生しました。"
End Sub
計算処理の間に何らかのエラーが発生すると「Err_line」のラベルの箇所まで処理がジャンプし、「エラーが発生しました」というメッセージボックスが表示され、プログラムが終了します。
エラーの内容をログに出力する
Errオブジェクトからエラー番号と詳細を取得する
エクセルVBAでは、Errオブジェクトというエラーが発生したときにその情報を格納しておいてくれる便利なオブジェクトがあります。
Errオブジェクトに対するNumberプロパティでエラー番号を、Descriptionプロパティでエラーの詳細を取得することができます。
これらはよくエラーメッセージで表示されるやつですね。Errオブジェクトを使えば、我々も取得することができるんです。
エラー処理としてエラーログをファイルに書き出す
例えば上記プログラムで言えば、エラー処理の箇所にこれらのプロパティの値をログファイルに書き出す処理を入れると良さそうですよね。
Sub calcUnitPrice()
On Error GoTo Err_line
'***** 計算処理 *****
Dim i As Long 'イテレータ
i = 2
With Sheet1
Do While .Cells(i, 1).Value <> ""
'C列D列で除算して、E列に結果を表示する
.Cells(i, 4).Value = .Cells(i, 2).Value / .Cells(i, 3).Value
i = i + 1
Loop
End With
Exit Sub
'***** エラー処理 *****
Err_line:
Call writeLog( _
Now & vbTab & _
"エラー番号:" & Err.Number & vbTab & _
"エラーの説明:" & Err.Description _
)
MsgBox _
"エラーが発生しました。" & vbNewLine & _
"詳細はerror.logをご覧ください"
End Sub
冒頭で紹介したログファイルへの書き込むプロシージャwriteLogにエラー番号と詳細を渡しています。
プログラム実行時にエラーが発生した場合は、以下のようなメッセージが表示されるとともに
ログ用のファイル「error.log」に以下のようなメッセージが追加されます。
まとめ
エクセルVBAでエラーログをテキストファイルに書き出す方法についてお伝えしました。
On ErrorステートメントとGotoステートメントによるラベルへのジャンプについては、エラー処理の基本になりますので、ぜひマスター頂ければと思います。
また、ErrオブジェクトのNumberプロパティ、Descriptionプロパティでエラー番号と詳細を取得する方法もお伝えしました。
次回は、Vlookupのエラーをログファイルに書き出す方法を紹介したいと思います。
どうぞお楽しみに!