🔧
LogToSheet
ユーティリティログメッセージをシートに書き込む
VBAの処理内容やエラー情報を専用ログシートに記録するマクロです。実行日時・処理内容・結果・エラーメッセージなどをログシートの末尾に追加していき、実行履歴として保持します。マクロの動作トラブルシューティングや、バッチ処理の完了確認、定期実行処理の実行記録として非常に有用です。条件によってログレベル(INFO/WARN/ERROR)を使い分けることもできます。内部ではCells(Rows.Count, 1).End(xlUp).Row + 1で常に最終行の次の空行を取得し、そこに実行日時・処理内容・結果を追記する構成です。GetCurrentDateTimeを内部的に呼び出してタイムスタンプを記録し、ShowMessageBoxと組み合わせればログ記録と同時にユーザーへの通知も行える一体的なエラー処理基盤を構築できます。

📖 使い方
- VBAエディタを開く(Alt + F11)
- モジュールを挿入(挿入 > モジュール)
- 下記VBAコードをコピー&ペースト
- ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 実行するとログシートにタイムスタンプ付きでメッセージが記録される
🎯 活用シーン
- ✓夜間バッチ処理の実行記録を翌朝確認するための処理ログ
- ✓大量データ更新マクロのエラー箇所を記録してデバッグに活用
- ✓定期実行マクロの実行時刻・処理件数の履歴管理
- ✓複数のマクロが連携する自動化フローで、どの処理がいつ成功・失敗したかを一元的に追跡したいとき
- ✓定期実行するバッチマクロの実行結果を、担当者が翌朝まとめて確認できるようにしたいとき
💡 実装のヒント
- ▸Cells(Rows.Count, 1).End(xlUp).Row + 1 でログの次の空行を取得します
- ▸ログシートが存在しない場合は自動作成するロジックを入れます
- ▸ログが増えすぎた場合は古い行を自動削除するクリーンアップ機能も有用です
- ▸ログレベル(INFO/WARN/ERROR)を列として分けておくと、後からAutoFilterで絞り込みやすくなります。
- ▸ログが数万行規模に増えた場合は、月ごとに別シートへアーカイブする仕組みを追加するとファイルサイズの肥大化を防げます。
💻 VBAコード
' LogToSheet
' -----------------
' Macro Name: LogToSheet
' Description: ログメッセージをシートに書き込む
' Parameters: なし
' Returns: なし
' Usage: 実行するとログシートにタイムスタンプ付きでメッセージが記録される
' -----------------
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