Excel VBA | フォルダ内の全 CSV を 1 枚の Excel に統合するテンプレート

Excel VBA VBA
スポンサーリンク

今回は 「成功時はログに記録、失敗時は通知+ログ両方」「複数スケジュールをConfigシートに書いて順次実行する版」 を紹介します。


1. 成功時はログに記録、失敗時は通知+ログ両方

成功時は通知不要でログに記録、失敗時は通知メール+ログ両方に残す設計です。

Sub SaveMerged_LogAndNotifyOnFailure()
    Dim wsMaster As Worksheet, wsLog As Worksheet
    Dim newWb As Workbook
    Dim savePath As String, todayStr As String
    Dim toAddr As String
    Dim success As Boolean
    
    Set wsMaster = ThisWorkbook.Sheets("Master")
    Set wsLog = ThisWorkbook.Sheets("Log")
    
    ' Configシートから保存先と宛先を取得
    Dim wsConfig As Worksheet
    Set wsConfig = ThisWorkbook.Sheets("Config")
    savePath = wsConfig.Range("B1").Value   ' 保存先パス
    toAddr = wsConfig.Range("B2").Value     ' 宛先メールアドレス
    
    todayStr = Format(Now, "yyyy-mm-dd HH:NN:SS")
    success = True
    
    On Error GoTo SaveErr
    
    ' 新しいブックを作成
    Set newWb = Workbooks.Add
    wsMaster.UsedRange.Copy newWb.Sheets(1).Cells(1, 1)
    
    Application.DisplayAlerts = False
    newWb.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True
    
    newWb.Close SaveChanges:=False
    
    ' 成功時はログに記録のみ
    LogResult wsLog, todayStr, savePath, "SUCCESS"
    GoTo EndProc
    
SaveErr:
    success = False
    ' 失敗時は通知+ログ
    Call SendMailWithAttachment(toAddr, "[CSV統合失敗通知]", _
        "統合結果の保存に失敗しました。" & vbCrLf & _
        "保存先: " & savePath & vbCrLf & _
        "日時: " & todayStr, "")
    LogResult wsLog, todayStr, savePath, "FAILURE"
    
EndProc:
    If success Then
        MsgBox "統合結果を保存しました(ログ記録のみ)。"
    Else
        MsgBox "保存に失敗し、通知メール+ログ記録しました。"
    End If
End Sub

' ログ記録用
Sub LogResult(wsLog As Worksheet, ts As String, path As String, status As String)
    Dim nextRow As Long
    If wsLog.Cells(1, 1).Value = "" Then
        wsLog.Range("A1:C1").Value = Array("日時", "保存先", "ステータス")
    End If
    nextRow = wsLog.Cells(wsLog.Rows.Count, "A").End(xlUp).Row + 1
    wsLog.Cells(nextRow, 1).Value = ts
    wsLog.Cells(nextRow, 2).Value = path
    wsLog.Cells(nextRow, 3).Value = status
End Sub
VB

2. 複数スケジュールをConfigシートに書いて順次実行する版

Configシートに複数の時刻を記載しておき、順次 OnTime でスケジュール設定します。
※ Configシートの A列 に時刻(例: 07:30, 12:00, 18:00)を並べておく前提。

Sub ScheduleMultipleFromConfig()
    Dim wsConfig As Worksheet
    Dim lastRow As Long, r As Long
    Dim runTime As String
    
    Set wsConfig = ThisWorkbook.Sheets("Config")
    lastRow = wsConfig.Cells(wsConfig.Rows.Count, "A").End(xlUp).Row
    
    For r = 1 To lastRow
        runTime = wsConfig.Cells(r, "A").Value
        If IsDate(runTime) Or runTime Like "*:*" Then
            Application.OnTime TimeValue(runTime), "SaveMergedAndNotifyWithAttachment", , True
        End If
    Next r
    
    MsgBox "複数スケジュールを設定しました。"
End Sub
VB

✅ まとめ

  • 成功時はログのみ、失敗時は通知+ログ → 運用負荷を減らしつつ、失敗は確実に検知。
  • 複数スケジュールConfig管理版 → Configシートに複数時刻を並べるだけで柔軟にスケジュール設定可能。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました