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

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

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

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

ログファイル

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

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

PR

VBAコード(クラス)

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

「クラスモジュール」の追加
追加した「クラスモジュール」の名前を「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」しないと、処理完了までログファイルの最新の内容(=処理の進捗状況)を確認できません。
※他サイトに記載のログ出力方法は、上記の配慮も足りていないようです。

PR

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

    Exit Sub

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

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

・ログファイルOPEN時のエラー処理   ※「LogFileOpenErr」
・ログファイルOPEN時以降のエラー処理 ※「Err」

PR

実行結果(正常終了)

ログを出力できました。

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

実行結果(異常終了)

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

異常終了のメッセージ
PR

参考

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

●Openステートメント
テキストファイルの読み込み/書き込みをします。


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

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