【ExcelVBA・マクロ】セルに入力した日時を自動記録するマクロ|誰がいつ更新したか履歴を残す方法【初心者向け】

セルに入力した日時を自動記録するマクロ ExcelVBA

Excelで管理表や日報を運用していると、次のような悩みが出てきませんか?

  • このデータ、いつ入力されたか分からない
  • 誰が最後に編集したか記録したい
  • 入力した瞬間の日時を自動で記録したい
  • 手入力だと記録漏れが起きる

こういったとき、セルに値が入力されたら自動で日時をスタンプするマクロが便利です。

今回紹介するコードを使えば、入力した瞬間に隣のセルへ自動で日時を記録できます。


スポンサーリンク
スポンサーリンク

こんな人におすすめ

  • 入力日時・更新日時を自動で記録したい人
  • 手入力での記録漏れを防ぎたい人
  • タスク管理表や進捗表で「いつ更新されたか」を残したい人
  • 複数人で共有するExcelで履歴を残したい人

このマクロを使えば、入力履歴の管理が自動化されます。


コードの動作イメージ

  1. 特定の列(例:B列)にデータを入力
  2. 入力した瞬間、隣の列(例:C列)に日時が自動記録される
  3. 上書きした場合も、最新の日時に更新される
  4. 日時列は手入力できないように保護される(任意)

基本:入力時に日時を自動記録するVBAコード

このコードは、シートモジュールに記述します。

コードの配置場所

  1. VBAエディタを開く(Alt + F11)
  2. 左側のプロジェクトエクスプローラーで、対象シートをダブルクリック
  3. 右側のコード画面に以下のコードを貼り付ける
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim inputColumn As Long
    Dim timestampColumn As Long
    
    ' 入力を監視する列(B列 = 2)
    inputColumn = 2
    ' 日時を記録する列(C列 = 3)
    timestampColumn = 3
    
    ' イベントの無限ループを防ぐ
    Application.EnableEvents = False
    
    ' 変更されたセルがB列の場合のみ処理
    If Target.Column = inputColumn And Target.Row > 1 Then
        ' 入力された場合のみ(削除時は記録しない)
        If Target.Value <> "" Then
            ' 隣のセルに現在の日時を記録
            Cells(Target.Row, timestampColumn).Value = Now
            Cells(Target.Row, timestampColumn).NumberFormat = "yyyy/mm/dd hh:mm:ss"
        Else
            ' 削除された場合は日時もクリア
            Cells(Target.Row, timestampColumn).ClearContents
        End If
    End If
    
    ' イベントを再度有効化
    Application.EnableEvents = True
End Sub

コードのポイント解説

① Worksheet_Change イベント

Private Sub Worksheet_Change(ByVal Target As Range)

この行は、シート上でセルが変更されたときに自動実行されます。
標準モジュールではなく、シートモジュールに書く必要があります。


② Application.EnableEvents = False

Application.EnableEvents = False
' 処理
Application.EnableEvents = True

これを書かないと、マクロ内でセルを変更したときに再度 Worksheet_Change が呼ばれ、無限ループになります。


③ Target.Column で列を判定

If Target.Column = inputColumn And Target.Row > 1 Then
  • Target.Column = 2:B列が変更された場合のみ反応
  • Target.Row > 1:見出し行(1行目)を除外

④ Now 関数で現在日時を取得

Cells(Target.Row, timestampColumn).Value = Now

Now 関数は、現在の日付と時刻を返します。
Date を使えば日付のみ、Time を使えば時刻のみになります。


応用編①:複数列の入力をまとめて監視

B列・D列・F列など、複数の列に対して日時を記録したい場合のコードです。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim monitorColumns As Variant
    Dim i As Long
    Dim isTargetColumn As Boolean
    
    ' 監視する列番号を配列で指定(B列=2, D列=4, F列=6)
    monitorColumns = Array(2, 4, 6)
    
    Application.EnableEvents = False
    
    ' 監視対象列かチェック
    isTargetColumn = False
    For i = 0 To UBound(monitorColumns)
        If Target.Column = monitorColumns(i) And Target.Row > 1 Then
            isTargetColumn = True
            Exit For
        End If
    Next i
    
    ' 対象列の場合のみ処理
    If isTargetColumn Then
        If Target.Value <> "" Then
            ' 入力列の右隣に日時を記録
            Cells(Target.Row, Target.Column + 1).Value = Now
            Cells(Target.Row, Target.Column + 1).NumberFormat = "yyyy/mm/dd hh:mm:ss"
        Else
            Cells(Target.Row, Target.Column + 1).ClearContents
        End If
    End If
    
    Application.EnableEvents = True
End Sub

応用編②:日付のみ記録する(時刻なし)

時刻は不要で、日付だけ記録したい場合は以下のように変更します。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim inputColumn As Long
    Dim timestampColumn As Long
    
    inputColumn = 2  ' B列
    timestampColumn = 3  ' C列
    
    Application.EnableEvents = False
    
    If Target.Column = inputColumn And Target.Row > 1 Then
        If Target.Value <> "" Then
            ' 日付のみ記録
            Cells(Target.Row, timestampColumn).Value = Date
            Cells(Target.Row, timestampColumn).NumberFormat = "yyyy/mm/dd"
        Else
            Cells(Target.Row, timestampColumn).ClearContents
        End If
    End If
    
    Application.EnableEvents = True
End Sub

応用編③:初回入力のみ記録(上書き更新しない)

一度記録したら、その後編集しても日時を更新したくない場合のコードです。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim inputColumn As Long
    Dim timestampColumn As Long
    
    inputColumn = 2
    timestampColumn = 3
    
    Application.EnableEvents = False
    
    If Target.Column = inputColumn And Target.Row > 1 Then
        ' 日時セルが空の場合のみ記録
        If Target.Value <> "" And Cells(Target.Row, timestampColumn).Value = "" Then
            Cells(Target.Row, timestampColumn).Value = Now
            Cells(Target.Row, timestampColumn).NumberFormat = "yyyy/mm/dd hh:mm:ss"
        End If
        
        ' 入力値が削除された場合は日時もクリア
        If Target.Value = "" Then
            Cells(Target.Row, timestampColumn).ClearContents
        End If
    End If
    
    Application.EnableEvents = True
End Sub

応用編④:入力者名も一緒に記録する

日時だけでなく、Windowsのユーザー名も記録したい場合のコードです。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim inputColumn As Long
    Dim timestampColumn As Long
    Dim userColumn As Long
    
    inputColumn = 2  ' B列
    timestampColumn = 3  ' C列(日時)
    userColumn = 4  ' D列(ユーザー名)
    
    Application.EnableEvents = False
    
    If Target.Column = inputColumn And Target.Row > 1 Then
        If Target.Value <> "" Then
            ' 日時を記録
            Cells(Target.Row, timestampColumn).Value = Now
            Cells(Target.Row, timestampColumn).NumberFormat = "yyyy/mm/dd hh:mm:ss"
            
            ' ユーザー名を記録
            Cells(Target.Row, userColumn).Value = Environ("USERNAME")
        Else
            Cells(Target.Row, timestampColumn).ClearContents
            Cells(Target.Row, userColumn).ClearContents
        End If
    End If
    
    Application.EnableEvents = True
End Sub

Environ("USERNAME") で、Windowsにログインしているユーザー名を取得できます。


よくあるエラーと対処法

エラー①:日時が記録されない

原因: コードを標準モジュールに書いている

対処法:
このコードはシートモジュールに書く必要があります。
VBAエディタで、左側のシート名をダブルクリックして開いた画面に貼り付けてください。


エラー②:マクロが止まる・無限ループする

原因: Application.EnableEvents = False が抜けている

対処法:
コード内で必ず EnableEvents = FalseEnableEvents = True をセットで書いてください。


エラー③:複数セルを一度に変更すると日時が記録されない

原因: Target が複数セルの範囲になっている

対処法:
次のように、1セルのみの変更に限定します。

If Target.Count > 1 Then Exit Sub

コードの最初に追加してください。


実務での活用例

✅ タスク管理表で「完了」と入力した日時を記録
✅ 在庫管理表で入出庫の記録時刻を自動記録
✅ 日報や週報の提出日時を自動記録
✅ 複数人で共有する進捗表で「誰がいつ更新したか」を残す
✅ データ入力フォームで入力日時を自動スタンプ


まとめ:入力日時の記録はWorksheet_Changeで自動化

  • Worksheet_Change イベントでセル変更を検知
  • Now 関数で現在日時を取得して記録
  • Application.EnableEvents = False で無限ループを防ぐ
  • 複数列・初回のみ・ユーザー名など、用途に合わせてカスタマイズ可能

手入力での記録漏れを防ぎ、データの信頼性を高めるために、ぜひ試してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました