【VBA】ログをファイル出力するクラス|LogWriter
作成日:2025-11-02
更新日:2025-11-02

ログを記録しよう
ログをテキストファイルに出力するクラス
'--- 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
- Microsoft Docs: File I/O functions (VBA) – 
FreeFile,Open,Print,Close
https://learn.microsoft.com/en-us/office/vba/language/concepts/getting-started/using-files - Chip Pearson (2010). Working With Arrays in VBA — array handling best practices.
 
Ultimate Advice
Keep logging simple and atomic — clarity beats complexity.
ログ出力は単純で完結に。複雑化より明快さを優先せよ。
| LogWriter|ログ出力クラス |
| Timestamp|タイムスタンプ |
| FreeFile|ファイル番号取得 |
| Variant Array|可変配列 |
| File I/O|ファイル入出力 |
| Refactoring|リファクタリング |
    
      
    
2025-11-02
      編集後記:
      この記事の内容がベストではないかもしれません。
    
記事一覧
- 
          
            
      
      

ユーザーフォームのタイトルバー非表示 【VBA】ユーザーフォームのタイトルバーを非表示にしてシステムっぽい見た目にする - 
          
            
      
      

UsedRangeのデータを配列で取得 【VBA】シートにあるデータを配列に格納する(空白含む)|UsedRange - 
          
            
      
      

ユーザーフォームをシステムっぽく 【VBA】ユーザーフォームのみ起動して、シートを表示しない方法 - 
          
            
      
      

[VBA]CreateObjectまとめ 【VBA】CreateObject|dictionary・テキストファイル・outlook・Access用にオブジェクトを生成する - 
          
            
      
      

文字の位置を取得 【VBA】文字列から指定文字の位置を取得する|InStr/InStrRev - 
          
            
      
      

dictionaryをセットする 【VBA】Dictionaryのセット|CreateObject(“Scripting.Dictionary”)