銀河鉄道

【VBA】ログをファイル出力するクラス|LogWriter

サムネイル
[VBA]Log WriterLet’s log this.
ログを記録しよう

ログをテキストファイルに出力するクラス

'--- LogWriter: Write execution logs to timestamped text file ---
'--- ログ出力クラス:タイムスタンプ付きテキストファイルを生成する ---

Private Const TEXT_FILE_NAME As String = "Log_{0}.txt"

Private arrLogs As Collection

Private Sub Class_Initialize()
	Set arrLogs = New Collection
	Add "ログ開始:" & Format(Now(), "yyyy/mm/dd hh:nn:ss")
End Sub

Public Sub Add(ByVal msg As String)
	arrLogs.Add msg
End Sub

Public Sub Save(Optional ByVal folderPath As String = "")
	Dim filePath As String
	filePath = IIf(folderPath = "", CurrentProject.Path, folderPath) & _
	           "\Log_" & Format(Now(), "yyyymmdd-hhnnss") & ".txt"

	Dim f As Integer
	f = FreeFile
	Open filePath For Output As #f
	Dim i As Variant
	For Each i In arrLogs
		Print #f, i
	Next
	Close #f

	Shell "notepad.exe """ & filePath & """", vbNormalFocus
End Sub

Executive Summary

クラス内でメッセージを配列に蓄積し、まとめてテキストファイルに出力、完了後にメモ帳を開く構造。

Detailed Explanation

構造のポイント

  • Class_Initialize:ログ開始時に "ログ開始時刻:..." を配列にセット。
  • Add / AddFirstLine:ログ内容を配列に追加または1行目に追記。
  • Output / 出力実行
    • フォルダパスを指定できる
    • ファイル名に日付時刻(yymmdd-hhnnss)を含む
    • notepad.exe で自動的に開く

日付フォーマットのポイント

hhmmss は危険

Format(Now(), "yymmdd-hhmmss")

ぱっと見では「-」を使っているため安全に見えるが、Format(Now(), "yymmdd-hhmmss")"hhmmss" 部分は「時分秒」のフォーマット指定である。
Now() は内部的に時刻情報を含むため、環境設定(ロケール)によっては : が自動的に挿入される場合がある。

例(ロケールによる違い)

日本語環境では問題ないが、英語圏など一部のシステムロケールでは次のように展開される。

Format(Now(), "yymmdd-hhmmss")

実際の出力例:

251102-10:30:45

この場合、: を含むためファイル名として無効となり、実行時エラー52が発生する。

安全策(ロケール非依存)

環境に依存せず安全に処理するには、次のように記述する。

Format(Now(), "yymmdd-hhnnss")

nn は分(minute)、ss は秒(second)を示し、: が自動的に入ることはない。

出力例:

251102-103045

これにより、どの環境でもファイル名として安全に使用できる。

まとめ

フォーマット意味問題点
"hhmmss"時刻(環境依存)一部ロケールで : が混入
"hhnnss"明示的に「時分秒」安全で安定

環境によっては : が混ざることがあるため、"hhnnss" に変更しておくのが確実な対策。

Referenced Insights & Citations

Ultimate Advice

Keep logging simple and atomic — clarity beats complexity.
ログ出力は単純で完結に。複雑化より明快さを優先せよ。

| LogWriter|ログ出力クラス |
| Timestamp|タイムスタンプ |
| FreeFile|ファイル番号取得 |
| Variant Array|可変配列 |
| File I/O|ファイル入出力 |
| Refactoring|リファクタリング |

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧