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 Sub
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
実行結果(正常終了)
ログを出力できました。
実行結果(異常終了)
テキストエディタ等により、
・ログファイルが開いている状態で
・メイン処理を実行すると(VBAからログファイルを開こうとすると)、
エラーメッセージが表示され処理が中止されます。
参考①
PC(サーバー)やWebサイトの死活監視をして、結果をログとして出力するのも良いと思います。
死活監視の詳細は、以下の記事をご確認ください。
参考②
単純に「テキストファイルを作成」することもできます。
詳細は以下の記事をご確認ください。
参考③
過去に作成されたログファイルを削除(ログローテート)することもできます。
※○○以前に更新されたファイルを削除できます。
※例えば「本日日付」と「ファイルの更新日時」の差が7日以上のファイルを削除できます。
詳細は以下の記事をご確認ください。
参考④
上記のVBAコード(クラス「Logger」)で使用した以下の詳細は、公式サイトをご確認ください。
●Openステートメント
テキストファイルを開きます。
●Closeステートメント
テキストファイルを閉じます。
●Printステートメント
テキストファイルへ出力します。