時刻ログのねらい
マクロを実行した「日時」を記録しておくと、
- 監査(いつ誰が動かしたか)
- 障害調査(どのタイミングで止まったか)
- 性能測定(処理開始から終了までの所要時間)
に役立ちます。初心者でも簡単に「時刻ログ」を残せるように、コード例とテンプレートをかみ砕いて解説します。
基本:現在時刻を取得する方法
例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:
ShowCurrentTimeを実行 → 現在時刻がメッセージで表示される。 - 例2:
WriteTimeLogを実行 → 「Log」シートに時刻と「処理開始」が記録される。 - 例3:
ProcessWithTimeLogを実行 → 開始と終了の両方がログに残る。 - 例4:
ProcessWithDurationLogを実行 → 所要時間が「Log」シートに秒単位で記録される。
実務の落とし穴と対策
- 落とし穴1:時刻の書式がバラバラ
- 対策:
Format(Now, "yyyy-mm-dd HH:NN:SS")で統一。
- 対策:
- 落とし穴2:処理が途中で止まると終了ログがない
- 対策: 開始ログだけでも残す。終了ログがなければ「異常終了」と判断できる。
- 落とし穴3:長時間処理で日付を跨ぐ
- 対策:
TimerではなくNowを使って開始・終了時刻を記録し、差分を計算。
- 対策:
- 落とし穴4:ログが肥大化
- 対策: ローテーション(古いログを別ファイルへ移動)や定期削除を設計。
スターター手順
- Logシートを作成(A列=時刻、B列=イベント)。
- テンプレを貼り付け(WriteTimeLogやProcessWithTimeLog)。
- 実行して確認 → 時刻が正しく記録されるか。
- 必要に応じて所要時間計測を追加。
