Excel VBA | 実務用 VBA コード集(テンプレ付き)

Excel VBA VBA
スポンサーリンク

VBA ログ管理テンプレート(月ごとログ+古い月を自動アーカイブ)

業務マクロでログを月ごとにまとめる場合、古い月のログを自動アーカイブ(ZIP化や別フォルダ移動)すると管理がさらに楽になります。ここでは「log_YYYYMM.txt」を月ごとに作成し、一定期間経過したらアーカイブフォルダへ移動する拡張版を紹介します。


月ごとログ+古いログを別フォルダへ移動

Option Explicit

'=== ログ出力(月ごとにファイル分割) ===
Sub WriteLogMonthly(msg As String)
    Dim fso As Object
    Dim ts As Object
    Dim filePath As String
    Dim logFileName As String
    
    ' 月ごとにファイル名を作成(例:log_202511.txt)
    logFileName = "log_" & Format(Date, "yyyymm") & ".txt"
    filePath = ThisWorkbook.Path & "\" & logFileName
    
    ' FileSystemObjectを使って追記
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile(filePath, 8, True) ' 8=追記モード, True=新規作成可
    
    ts.WriteLine Format(Now, "yyyy/mm/dd hh:nn:ss") & " - " & msg
    ts.Close
    
    ' 古いログをアーカイブ
    Call ArchiveOldLogs(3) ' 3か月以上前のログを移動
End Sub

'=== 古いログをアーカイブフォルダへ移動 ===
Sub ArchiveOldLogs(monthThreshold As Long)
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim archivePath As String
    Dim logFolderPath As String
    
    logFolderPath = ThisWorkbook.Path
    archivePath = logFolderPath & "\Archive"
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' アーカイブフォルダがなければ作成
    If Not fso.FolderExists(archivePath) Then
        fso.CreateFolder archivePath
    End If
    
    Set folder = fso.GetFolder(logFolderPath)
    
    For Each file In folder.Files
        ' ファイル名が "log_YYYYMM.txt" の形式か確認
        If InStr(file.Name, "log_") = 1 And Right(file.Name, 4) = ".txt" Then
            Dim fileYear As Integer, fileMonth As Integer
            On Error Resume Next
            fileYear = CInt(Mid(file.Name, 5, 4))
            fileMonth = CInt(Mid(file.Name, 9, 2))
            On Error GoTo 0
            
            If fileYear > 0 And fileMonth > 0 Then
                Dim fileDate As Date
                fileDate = DateSerial(fileYear, fileMonth, 1)
                
                ' 指定月数より古い場合はアーカイブへ移動
                If DateDiff("m", fileDate, Date) >= monthThreshold Then
                    fso.MoveFile file.Path, archivePath & "\" & file.Name
                End If
            End If
        End If
    Next file
End Sub

'=== メイン処理例 ===
Sub MainProcess()
    On Error GoTo ErrHandler
    
    WriteLogMonthly "処理開始"
    
    ' ▼業務処理の例
    Range("A1").Value = "Hello VBA!"
    
    WriteLogMonthly "処理正常終了"
    Exit Sub
    
ErrHandler:
    WriteLogMonthly "エラー発生: " & Err.Number & " - " & Err.Description
    MsgBox "エラーが発生しました。ログを確認してください。", vbCritical
End Sub
VB

ZIP化したい場合(Windows標準のZIP機能を利用)

VBA単体ではZIP圧縮は直接できませんが、Windowsの「圧縮フォルダ」機能を呼び出すことで可能です。
ただし、実務では「古いログをアーカイブフォルダへ移動」→「外部ツールやバッチでZIP化」する運用が現実的です。


実務でのメリット

  • 月ごとにログがまとまる → ファイル数が減り管理が楽
  • 古いログは自動でアーカイブフォルダへ移動 → フォルダが整理される
  • 保管期間を柔軟に設定可能ArchiveOldLogs(3) を変更すれば「6か月」「12か月」などに対応

✅ まとめ

  • WriteLogMonthly → 月ごとにログを出力
  • ArchiveOldLogs → 古い月のログを自動でアーカイブフォルダへ移動
  • ZIP化は外部ツール連携が現実的
タイトルとURLをコピーしました