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

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

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


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


ログ出力を実現するクラス「Logger」を作成し、
 ・メイン処理からこのクラスを呼び出して、
 ・ログを出力する
ようにします!
VBAコード(クラス)
ログ出力を実現するクラス「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 SubVBAコード(メイン処理)
メイン処理を作成します。
上記で作成したクラス「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
実行結果(正常終了)
ログを出力できました。

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

参考①
PC(サーバー)やWebサイトの死活監視をして、結果をログとして出力するのも良いと思います。
死活監視の詳細は、以下の記事をご確認ください。
参考②
単純に「テキストファイルを作成」することもできます。
詳細は以下の記事をご確認ください。
参考③
過去に作成されたログファイルを削除(ログローテート)することもできます。
※○○以前に更新されたファイルを削除できます。
※例えば「本日日付」と「ファイルの更新日時」の差が7日以上のファイルを削除できます。
詳細は以下の記事をご確認ください。
参考④
上記のVBAコード(クラス「Logger」)で使用した以下の詳細は、公式サイトをご確認ください。
●Openステートメント
テキストファイルを開きます。
●Closeステートメント
テキストファイルを閉じます。
●Printステートメント
テキストファイルへ出力します。

 
  
  
  
  



