Excel VBA 逆引き集 | 時刻ログ

Excel VBA
スポンサーリンク

時刻ログのねらい

マクロを実行した「日時」を記録しておくと、

  • 監査(いつ誰が動かしたか)
  • 障害調査(どのタイミングで止まったか)
  • 性能測定(処理開始から終了までの所要時間)

に役立ちます。初心者でも簡単に「時刻ログ」を残せるように、コード例とテンプレートをかみ砕いて解説します。


基本:現在時刻を取得する方法

例1:Now 関数で日時を取得

Sub ShowCurrentTime()
    MsgBox "現在時刻は " & Now
End Sub
VB
  • ポイント:
    • Now は「日付+時刻」を返す。
    • 例: 2025/12/15 18:30:45 のような形式。

例2:Time 関数で時刻だけ取得

Sub ShowTimeOnly()
    MsgBox "現在の時刻は " & Time
End Sub
VB
  • ポイント:
    • Time は「時刻のみ」を返す。
    • 例: 18:30:45

シートに時刻ログを残すテンプレート

Sub WriteTimeLog()
    Dim ws As Worksheet
    Set ws = Worksheets("Log") ' ログ用シートを用意
    
    Dim r As Long
    r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
    
    ws.Cells(r, 1).Value = Format(Now, "yyyy-mm-dd HH:NN:SS")
    ws.Cells(r, 2).Value = "処理開始"
    
    MsgBox "ログを記録しました。Row=" & r
End Sub
VB
  • 重要ポイント(深掘り):
    • Format(Now, "yyyy-mm-dd HH:NN:SS") で「年月日+時刻」を整形。
      • yyyy = 西暦
      • mm = 月
      • dd = 日
      • HH = 時(24時間表記)
      • NN = 分
      • SS = 秒
    • ログシートを用意する: 「Log」という名前のシートを作り、A列に時刻、B列にイベント内容を記録。
    • 行追加: End(xlUp).Row + 1 で最終行の次に追記。

開始と終了を記録するテンプレート

Sub ProcessWithTimeLog()
    Dim ws As Worksheet: Set ws = Worksheets("Log")
    Dim r As Long
    
    ' 開始ログ
    r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
    ws.Cells(r, 1).Value = Format(Now, "yyyy-mm-dd HH:NN:SS")
    ws.Cells(r, 2).Value = "処理開始"
    
    ' --- 本処理 ---
    Dim i As Long
    For i = 1 To 100000
        Dim s As String
        s = "テスト" & i
    Next
    ' --- 本処理ここまで ---
    
    ' 終了ログ
    r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
    ws.Cells(r, 1).Value = Format(Now, "yyyy-mm-dd HH:NN:SS")
    ws.Cells(r, 2).Value = "処理終了"
    
    MsgBox "処理完了。ログに開始と終了を記録しました。"
End Sub
VB
  • 重要ポイント(深掘り):
    • 開始と終了を必ずセットで記録。 これで「処理がいつ始まり、いつ終わったか」が分かる。
    • 処理が途中で止まった場合: 終了ログがないので「失敗した」と判断できる。

所要時間を計測してログに残す

Sub ProcessWithDurationLog()
    Dim ws As Worksheet: Set ws = Worksheets("Log")
    Dim r As Long
    
    Dim t0 As Double, t1 As Double
    t0 = Timer ' 開始秒数
    
    ' --- 本処理 ---
    Dim i As Long
    For i = 1 To 200000
        Dim s As String
        s = "テスト" & i
    Next
    ' --- 本処理ここまで ---
    
    t1 = Timer ' 終了秒数
    
    ' ログ記録
    r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
    ws.Cells(r, 1).Value = Format(Now, "yyyy-mm-dd HH:NN:SS")
    ws.Cells(r, 2).Value = "処理時間: " & Format(t1 - t0, "0.00") & " 秒"
    
    MsgBox "処理時間をログに記録しました。"
End Sub
VB
  • 重要ポイント(深掘り):
    • Timer 関数: その日の「0時からの経過秒数」を返す。
    • 差分計算: t1 - t0 で処理時間を秒単位で取得。
    • 日跨ぎ注意: 深夜0時を跨ぐと値がリセットされるので、長時間処理には Now を使う方が安全。

例題で練習

  1. 例1: ShowCurrentTime を実行 → 現在時刻がメッセージで表示される。
  2. 例2: WriteTimeLog を実行 → 「Log」シートに時刻と「処理開始」が記録される。
  3. 例3: ProcessWithTimeLog を実行 → 開始と終了の両方がログに残る。
  4. 例4: ProcessWithDurationLog を実行 → 所要時間が「Log」シートに秒単位で記録される。

実務の落とし穴と対策

  • 落とし穴1:時刻の書式がバラバラ
    • 対策: Format(Now, "yyyy-mm-dd HH:NN:SS") で統一。
  • 落とし穴2:処理が途中で止まると終了ログがない
    • 対策: 開始ログだけでも残す。終了ログがなければ「異常終了」と判断できる。
  • 落とし穴3:長時間処理で日付を跨ぐ
    • 対策: Timer ではなく Now を使って開始・終了時刻を記録し、差分を計算。
  • 落とし穴4:ログが肥大化
    • 対策: ローテーション(古いログを別ファイルへ移動)や定期削除を設計。

スターター手順

  1. Logシートを作成(A列=時刻、B列=イベント)。
  2. テンプレを貼り付け(WriteTimeLogやProcessWithTimeLog)。
  3. 実行して確認 → 時刻が正しく記録されるか。
  4. 必要に応じて所要時間計測を追加。
タイトルとURLをコピーしました