【EXCEL VBA】VBAのログをファイル出力したい

VBAでのログ出力とえば「Debug.print」だと思います。開発中にイミディエイトウインドウを何度も何度も確認したと思います。ただイミディエイトウィンドウは検索や出力量に制限があるため、やや使いづらいですね。この課題を解決する方法を紹介します。

事前準備

VBAログ管理のために「VBA-Log」を導入します。Githubで管理されています。

[Logger.bas]をダウンロードしてVBEのプロジェクトエクスプローラーにドラッグ&ドロップしてください。以下の状態になればOKです。これで事前準備は完了です。

サンプルプログラム(コピペでOK)

まずは簡単なところから。ログ出力の閾値を指定して、閾値以上のログをイミディエイトウィンドウに出力するサンプルです。

Option Explicit

Sub sample()

    Logger.LogDebug "デフォルトではログ出力不可なので何も出力されない。"

    Logger.LogEnabled = True    ' 全レベルでログ出力(1:Trace, 2:Debug, 3:Info, 4:Warn, 5:Error)
    Logger.LogTrace "全レベル指定 Traceログ"
    Logger.LogDebug "全レベル指定 Debugログ"
    Logger.LogInfo "全レベル指定 Infoログ"
    Logger.LogWarn "全レベル指定 Warnログ"
    Logger.LogError "全レベル指定 Errorログ"
 
    Logger.LogThreshold = 3     ' ログレベル3以上で出力(3:Info, 4:Warn, 5:Error)
    Logger.LogTrace "ログレベル3指定 Traceログ"
    Logger.LogDebug "ログレベル3指定 Debugログ"
    Logger.LogInfo "ログレベル3指定 Infoログ"
    Logger.LogWarn "ログレベル3指定 Warnログ"
    Logger.LogError "ログレベル3指定 Errorログ"

End Sub

出力例

Trace - 全レベル指定 Traceログ
Debug - 全レベル指定 Debugログ
Info  - 全レベル指定 Infoログ
WARN  - 全レベル指定 Warnログ
ERROR - 全レベル指定 Errorログ

Info  - ログレベル3指定 Infoログ
WARN  - ログレベル3指定 Warnログ
ERROR - ログレベル3指定 Errorログ

このままだと閾値指定が出来ただけです。イミディエイトウィンドウにログ出力されるため、課題は解決されていません。

先ほどと同じプログラムですが、コールバック関数の定義と登録を追加しました。結果、ログ出力処理がLogFileDesu関数に集約されました。 サンプルではLogFileDesu関数内でDebug.Printで出力していますが、ファイル出力やExcelシートへ出力、外部APIへの出力など、LogFileDesu関数定義しだいで何でもできるようになります。

注意事項 本プログラムは標準モジュールに記載してください。ThisWookbook、Sheetでは動きません。

Option Explicit

' コールバック関数を定義(関数名は何でもOK。引数だけ合わせましょう)
Public Sub LogFileDesu(Level As Long, Message As String, From As String)
    Open "C:\dell\hoge.txt" For Append As #1
        Print #1, Level; Message; From
    Close #1
End Sub

Sub sample()
    
    ' ログ出力処理をするコールバック関数名を登録する
    Logger.LogCallback = "LogFileDesu"

    Logger.LogDebug "デフォルトではログ出力不可なので何も出力されない。"

    Logger.LogEnabled = True    ' 全レベルでログ出力(Trace, Debug, Info, Warn, Error)
    Logger.LogTrace "全レベル指定 Traceログ"
    Logger.LogDebug "全レベル指定 Debugログ"
    Logger.LogInfo "全レベル指定 Infoログ"
    Logger.LogWarn "全レベル指定 Warnログ"
    Logger.LogError "全レベル指定 Errorログ"
 
    Logger.LogThreshold = 3     ' ログレベル3以上で出力(Info, Warn, Error)
    Logger.LogTrace "ログレベル3指定 Traceログ"
    Logger.LogDebug "ログレベル3指定 Debugログ"
    Logger.LogInfo "ログレベル3指定 Infoログ"
    Logger.LogWarn "ログレベル3指定 Warnログ"
    Logger.LogError "ログレベル3指定 Errorログ"

End Sub

ファイル出力例(C:\dell\hoge.txt)

 1 全レベル指定 Traceログ
 2 全レベル指定 Debugログ
 3 全レベル指定 Infoログ
 4 全レベル指定 Warnログ
 5 全レベル指定 Errorログ
 3 ログレベル3指定 Infoログ
 4 ログレベル3指定 Warnログ
 5 ログレベル3指定 Errorログ

更に書くとコールバック関数は複数登録することができます。ファイル出力と外部API両方に出力したい場合は2つのコールバック関数を配列で登録します。

    ' ログ出力処理をするコールバック関数名を複数登録する
    Logger.LogCallback = Array("LogFileDesu", "LogAPIDesu")