【VBA】ログを出力する【完全版】

VBAでログを出力する方法は
複数あります!

この記事では
 ・私が最善と考える方法を
記載します!

ログとして
 ・日時
 ・出力メッセージ
を出力します!

ログファイルに出力する内容
ログファイルに出力する内容

テキストエディタ等により
 ・ログファイルを開いている状態で、
 ・VBAからログファイルを開こうとした場合は、
エラーメッセージを表示して処理を中止させます!
※他サイトに記載のログ出力方法は、この考慮が足りていないようです。

ログファイルOPENエラー
ログファイルOPENエラー

ログ出力を実現するクラス「Logger」を作成し、
 ・メイン処理からこのクラスを呼び出して、
 ・ログを出力する
ようにします!

PR

VBAコード(クラス)

ログ出力を実現するクラス「Logger」を作成します。

プロジェクトを右クリックし「挿入」-「クラスモジュール」をクリックして、クラスを作成します。
ここでは名前を「Logger」とします。

「クラスモジュール」の追加
「クラスモジュール」の追加
追加した「クラスモジュール」の名前を「Logger」にした
追加した「クラスモジュール」の名前を「Logger」にした

作成したクラス「Logger」に、以下のVBAコードを記載します。

Option Explicit

'メンバ変数
Private fileNo As Integer
Private logFilePath As String

'----------------
'ログファイルOPEN
'----------------
Public Sub OpenFile(filePath As String)
    'ログファイルのパスを設定
    logFilePath = filePath
    '使用可能なファイル番号を取得
    fileNo = FreeFile
    '追記モードでOPEN(ログファイルが存在しない場合は新規作成)
    Open logFilePath For Append As #fileNo
End Sub

'----------------
'ログ出力
'----------------
Public Sub WriteFile(message As String)
    'ログ出力
    Print #fileNo, Now & " " & message
    '反映させるために一旦CLOSEし再OPEN
    Close #fileNo
    Open logFilePath For Append As #fileNo
End Sub

'----------------
'ログファイルCLOSE
'----------------
Public Sub CloseFile()
    Close #fileNo
End Sub

以下の処理(メソッド)を作成します。これらはメイン処理から呼び出します。
・OpenFile・・・ログファイルOPEN処理 ※ログファイルをAppend(追記モード)で開きます。
・WriteFile・・・ログ出力処理
・CloseFile・・・ログファイルCLOSE処理

ログ出力後にログファイルを「一旦CLOSEし再OPEN」することで、
 ・処理実行中にテキストエディタ等でログファイルを開いた際に、
 ・ログファイルの最新の内容(=処理の進捗状況)を確認する
ことができます(26~27行目)。

※「一旦CLOSEし再OPEN」しないと、処理完了までログファイルの最新の内容(=処理の進捗状況)を確認できません。
※他サイトに記載のログ出力方法は、この配慮も足りていないようです。

PR

VBAコード(メイン処理)

メイン処理を作成します。
上記で作成したクラス「Logger」の処理(メソッド)を呼び出します。
※エラー処理も記載します。

ここではVBAを実行するExcelファイルと同じフォルダ上に、ファイル「log.txt」を作成しログを出力します。

'変数の宣言を必須
Option Explicit

'*****************************************
'メイン処理
'*****************************************
Sub main()
    
    Dim filePath As String
    Dim Logger As Logger
    Dim errorMessage As String
    
    'ログファイルのパスを指定
    filePath = ThisWorkbook.Path & "\log.txt"
    
    'クラス「Logger」のオブジェクトを作成
    Set Logger = New Logger
    
    On Error GoTo LogFileOpenErr

    'ログファイルOPEN
    Logger.OpenFile (filePath)
    
    On Error GoTo Err

    'ログ出力
    Logger.WriteFile ("メッセージをログへ出力")
    'ログファイルCLOSE
    Logger.CloseFile

    '後片付け
    Set Logger = Nothing

    Exit Sub
    
LogFileOpenErr:
    '後片付け
    Set Logger = Nothing
    'エラーメッセージを設定
    errorMessage = "ログファイルOPENでエラーが発生しました。" & vbCrLf & _
                    "ログファイルを開いている場合は閉じてください。" & vbCrLf & _
                    "処理を中断します。"
    'エラーメッセージを出力
    MsgBox errorMessage, vbCritical, "エラー発生"

    Exit Sub

Err:
    'ログファイルCLOSE
    Logger.CloseFile
    '後片付け
    Set Logger = Nothing
    'エラーメッセージを設定
    errorMessage = "エラーが発生しました。" & vbCrLf & _
            "処理を中断します" & vbCrLf & vbCrLf & _
            "エラー番号: " & Err.Number & vbCrLf & _
            "エラー内容: " & Err.Description
    'エラーメッセージを出力
    MsgBox errorMessage, vbCritical, "エラー発生"
    
End Sub

エラーが発生する可能性があるため、2つのエラー処理を記載しています。

・ログファイルOPEN時のエラー処理   ※「LogFileOpenErr(19、36~46行目)」
・ログファイルOPEN時以降のエラー処理 ※「Err(24、48~59行目)」

PR

実行結果(正常終了)

ログを出力できました。

ログファイルに出力された内容
ログファイルに出力された内容
PR

実行結果(異常終了)

テキストエディタ等により、
 ・ログファイルが開いている状態で
 ・メイン処理を実行すると(VBAからログファイルを開こうとすると)、
エラーメッセージが表示され処理が中止されます。

ログファイルOPENエラー
ログファイルOPENエラー
PR

参考①

PC(サーバー)やWebサイトの死活監視をして、結果をログとして出力するのも良いと思います。

死活監視の詳細は、以下の記事をご確認ください。


PR

参考②

単純に「テキストファイルを作成」することもできます。

詳細は以下の記事をご確認ください。

PR

参考③

過去に作成されたログファイルを削除(ログローテート)することもできます。
※○○以前に更新されたファイルを削除できます。
※例えば「本日日付」と「ファイルの更新日時」の差が7日以上のファイルを削除できます。

詳細は以下の記事をご確認ください。

PR

参考④

上記のVBAコード(クラス「Logger」)で使用した以下の詳細は、公式サイトをご確認ください。

●Openステートメント
テキストファイルを開きます。


●Closeステートメント
テキストファイルを閉じます。


●Printステートメント
テキストファイルへ出力します。