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

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

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

以下のように
 ・日時
 ・出力するメッセージ
を出力させます!

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

ログ出力を実現するクラス「LogClass」を作成し、
メイン処理から使用してログを出力する形とします!

VBAコード(クラス)

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

作成したクラス「LogClass」に、以下の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処理
・WriteFile・・・ログ出力処理
・CloseFile・・・ログファイルCLOSE処理

ログ出力後にログファイルを「一旦CLOSEし再OPEN」ことで、
メイン処理の実行中にテキストエディタ等でログファイルを開いた際に、
ログファイルの最新の内容を確認することができます。
※「一旦CLOSEし再OPEN」をしないと、メイン処理が完了するまでログファイルの最新の内容を確認することができません。
  ➡メイン処理が長時間となる場合、ログファイルにより処理状況を確認しようとしても確認できません。

※他サイトに記載のログ出力方法は、上記の配慮も足りていない場合が多いです。

VBAコード(メイン処理)

メイン処理を作成します。
クラス「LogClass」に記載した処理(メソッド)を呼び出します。

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

'変数の宣言を必須
Option Explicit

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

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

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

    '後片付け
    Set log = Nothing

    Exit Sub
    
LogFileOpenErr:
    'エラーメッセージを設定
    errorMessage = "ログファイルを開くことができませんでした。" & vbCrLf & _
            "処理を中断します。"
    'エラーメッセージを出力
    MsgBox errorMessage, vbCritical, "エラー発生"
    
    Exit Sub

Err:
    'エラーメッセージを設定
    errorMessage = "エラーが発生しました。" & vbCrLf & _
            "処理を中断します" & vbCrLf & vbCrLf & _
            "エラー番号: " & Err.Number & vbCrLf & _
            "エラー内容: " & Err.Description
    'エラーメッセージを出力
    MsgBox errorMessage, vbCritical, "エラー発生"
    
End Sub

実行結果(正常終了)

ログを出力することができました。

実行結果(異常終了)

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

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