今回は 「成功時はログに記録、失敗時は通知+ログ両方」 と 「複数スケジュールを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
VB2. 複数スケジュールを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シートに複数時刻を並べるだけで柔軟にスケジュール設定可能。

