エクセルVBAでエラーが発生したらエラーの内容をログファイルに書き出すプログラム


エクセルVBAでエラーを知らせるメッセージボックス

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでマクロの動作状況をログファイルに出力する方法についてシリーズでお伝えしています。

前回の記事はこちらでした。

エクセルVBAでテキストファイルを新規作成するFileSystemオブジェクトの使い方
エクセル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 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.Number
Err.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にエラー番号と詳細を渡しています。

プログラム実行時にエラーが発生した場合は、以下のようなメッセージが表示されるとともに

エクセルVBAでエラーを知らせるメッセージボックス

ログ用のファイル「error.log」に以下のようなメッセージが追加されます。

エクセルVBAでエラー番号と詳細をログファイルに書き出した

まとめ

エクセルVBAでエラーログをテキストファイルに書き出す方法についてお伝えしました。

On ErrorステートメントGotoステートメントによるラベルへのジャンプについては、エラー処理の基本になりますので、ぜひマスター頂ければと思います。

また、ErrオブジェクトのNumberプロパティ、Descriptionプロパティでエラー番号と詳細を取得する方法もお伝えしました。

次回は、Vlookupのエラーをログファイルに書き出す方法を紹介したいと思います。

どうぞお楽しみに!

連載目次:エクセルVBAでマクロの動作状況をログファイルに残す方法

マクロの動作状況やエラーの発生などをログファイルに記録しておきたいときありますよね。本シリーズではFileSystemオブジェクトを使ってログをテキストファイルに書き込む方法についてお伝えしていきます。
  1. エクセルVBAでマクロの動作をログファイルに記録する最も簡単なプログラム
  2. エクセルVBAでテキストファイルを新規作成するFileSystemオブジェクトの使い方
  3. エクセルVBAでエラーが発生したらエラーの内容をログファイルに書き出すプログラム

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