0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

夜間バッチや定期マクロの「いつ・どうなった」を後から追えるようにする3つのマクロ

0
Posted at

夜間バッチや定期マクロの「いつ・どうなった」を後から追えるようにする3つのマクロ

タグ: Excel VBA 業務効率化 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本、サイトにまとめて公開しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?