夜間バッチや定期マクロの「いつ・どうなった」を後から追えるようにする3つのマクロ
タグ:
ExcelVBA業務効率化Tips初心者
投稿先: Qiita
「動いたはずなのに、何時に終わったか分からない」を防ぐ
毎晩決まった時間に走らせているバッチ処理や、複数のマクロが連携する自動化フロー。動いていること自体は分かっていても、「何時に始まって何時に終わったか」「途中で何か問題は起きなかったか」を翌朝まとめて確認したい、ということはよくあります。今回は、処理の時刻を記録し、結果をログシートに蓄積し、完了を担当者に知らせる——という一連の基盤を作る実マクロを3つ紹介します。
1. 処理の開始・終了時刻を記録する — GetCurrentDateTime
まず基本となるのが、現在日時を任意のセルに書き込むマクロです。
Sub GetCurrentDateTime()
Dim ws As Worksheet
Dim cellAddr As String
Dim formatType As String
Dim currentDT As Date
On Error GoTo ErrorHandler
Set ws = ActiveSheet
cellAddr = InputBox("書き込み先のセルアドレスを入力:", "日時取得", "A1")
If cellAddr = "" Then
Exit Sub
End If
On Error Resume Next
Dim testCell As Range
Set testCell = ws.Range(cellAddr)
On Error GoTo ErrorHandler
If testCell Is Nothing Then
MsgBox "無効なセルアドレスです: " & cellAddr, vbCritical, "エラー"
Exit Sub
End If
formatType = InputBox("表示形式を選択:" & vbCrLf & _
"1: yyyy/mm/dd hh:nn:ss" & vbCrLf & _
"2: yyyy/mm/dd" & vbCrLf & _
"3: hh:nn:ss" & vbCrLf & _
"4: gggee年mm月dd日", "形式選択", "1")
currentDT = Now
Select Case formatType
Case "1"
ws.Range(cellAddr).NumberFormat = "yyyy/mm/dd hh:nn:ss"
Case "2"
ws.Range(cellAddr).NumberFormat = "yyyy/mm/dd"
Case "3"
ws.Range(cellAddr).NumberFormat = "hh:nn:ss"
Case "4"
ws.Range(cellAddr).NumberFormat = "gggee年mm月dd日"
Case Else
MsgBox "無効な選択です。", vbExclamation
Exit Sub
End Select
ws.Range(cellAddr).Value = currentDT
MsgBox "現在日時を書き込みました: " & Format(currentDT, "yyyy/mm/dd hh:nn:ss"), vbInformation
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
内部ではNow関数で現在日時を取得し、Format関数で指定した書式に整形してからセルに書き込んでいます。処理開始時と終了時の両方でこのマクロを呼べば、DateDiff関数で処理時間の差分まで算出できます。単体でも使えますが、他の多くのマクロから内部的に呼び出される基礎部品としての性格が強いマクロです。
2. 実行結果をログシートに蓄積する — LogToSheet
時刻が取れるようになったら、次は「いつ・どのレベルで・何が起きたか」を1行ずつ記録していくログシートです。
Sub LogToSheet()
Dim ws As Worksheet
Dim logMsg As String
Dim logLevel As String
Dim outputRow As Long
Dim lastRow As Long
On Error GoTo ErrorHandler
logLevel = InputBox("ログレベルを選択:" & vbCrLf & _
"1: INFO" & vbCrLf & _
"2: WARNING" & vbCrLf & _
"3: ERROR" & vbCrLf & _
"4: DEBUG", "ログ記録", "1")
If logLevel = "" Then
Exit Sub
End If
logMsg = InputBox("ログメッセージを入力:", "ログ記録")
If logMsg = "" Then
MsgBox "メッセージが空です。", vbInformation
Exit Sub
End If
Select Case logLevel
Case "1": logLevel = "INFO"
Case "2": logLevel = "WARN"
Case "3": logLevel = "ERROR"
Case "4": logLevel = "DEBUG"
Case Else: logLevel = "INFO"
End Select
On Error Resume Next
Set ws = Worksheets("ログ")
On Error GoTo ErrorHandler
If ws Is Nothing Then
Set ws = Worksheets.Add(Before:=Worksheets(1))
ws.Name = "ログ"
ws.Cells(1, 1).Value = "日時"
ws.Cells(1, 2).Value = "レベル"
ws.Cells(1, 3).Value = "メッセージ"
ws.Cells(1, 1).Font.Bold = True
ws.Cells(1, 2).Font.Bold = True
ws.Cells(1, 3).Font.Bold = True
ws.Range(ws.Cells(1, 1), ws.Cells(1, 3)).Interior.Color = RGB(200, 200, 200)
End If
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
outputRow = lastRow + 1
ws.Cells(outputRow, 1).Value = Now
ws.Cells(outputRow, 1).NumberFormat = "yyyy/mm/dd hh:nn:ss"
ws.Cells(outputRow, 2).Value = logLevel
ws.Cells(outputRow, 3).Value = logMsg
Select Case logLevel
Case "WARN": ws.Cells(outputRow, 2).Interior.Color = RGB(255, 255, 0)
Case "ERROR": ws.Cells(outputRow, 2).Interior.Color = RGB(255, 100, 100)
Case "DEBUG": ws.Cells(outputRow, 2).Interior.Color = RGB(200, 200, 200)
End Select
ws.Columns("A:C").AutoFit
MsgBox "ログを記録しました。", vbInformation
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
Cells(Rows.Count, 1).End(xlUp).Rowで常に最終行の次の空行を取得し、そこに日時・レベル・メッセージを追記していく構成です。ログレベル(INFO/WARN/ERROR/DEBUG)を列として分けてあるので、後からAutoFilterでERRORだけ絞り込む、といった使い方もできます。夜間バッチの実行記録を翌朝確認する、複数マクロが連携するフローでどの処理がいつ成功・失敗したかを一元的に追跡する、といった場面で特に有用です。
3. 処理完了を担当者に通知する — ShowMessageBox
最後に、処理が終わったこと(あるいは問題が起きたこと)をその場で知らせるメッセージボックスです。
Sub ShowMessageBox()
Dim msgText As String
Dim msgType As String
Dim iconType As VbMsgBoxStyle
Dim result As VbMsgBoxResult
On Error GoTo ErrorHandler
msgText = InputBox("表示するメッセージを入力:", "メッセージボックス表示", " Hello, World! ")
If msgText = "" Then
Exit Sub
End If
msgType = InputBox("種類を選択:" & vbCrLf & _
"1: 情報 (OKのみ)" & vbCrLf & _
"2: 警告 (OKのみ)" & vbCrLf & _
"3: エラー (OKのみ)" & vbCrLf & _
"4: 確認 (はい/いいえ)" & vbCrLf & _
"5: 詳細確認 (はい/いいえ/キャンセル)", "種類選択", "1")
Select Case msgType
Case "1": iconType = vbInformation
Case "2": iconType = vbExclamation
Case "3": iconType = vbCritical
Case "4": iconType = vbYesNo + vbQuestion
Case "5": iconType = vbYesNoCancel + vbQuestion
Case Else
MsgBox "無効な選択です。", vbExclamation
Exit Sub
End Select
result = MsgBox(msgText, iconType, "カスタムメッセージ")
Select Case result
Case vbYes: MsgBox "「はい」が選択されました。", vbInformation
Case vbNo: MsgBox "「いいえ」が選択されました。", vbInformation
Case vbCancel: MsgBox "「キャンセル」が選択されました。", vbInformation
Case vbOK: MsgBox "「OK」が選択されました。", vbInformation
End Select
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
アイコン(情報・警告・エラー)とボタンの組み合わせ(OKのみ・はい/いいえ・はい/いいえ/キャンセル)を選べるので、単なる完了通知だけでなく「このまま続けますか?」という確認ダイアログとしても使えます。長時間かかる処理なら開始時と完了時の両方で表示すれば、担当者が離席していても処理状況を見失いません。
まとめ: 「時刻を取る」「記録する」「知らせる」で自動化フローの土台を作る
GetCurrentDateTimeで時刻を取得し、LogToSheetでログシートに蓄積し、ShowMessageBoxで担当者に知らせる——この3つを組み合わせると、夜間バッチや複数マクロが連携する自動化フローの「いつ・どうなったか」を後から確認できる土台が整います。3つとも単体の小さなマクロなので、既存のバッチ処理に1つずつ組み込んでみてください。
紹介した3つを含む、VBAマクロを100本、サイトにまとめて公開しています。
