〖ExcelVBA・マクロ〗セルを変更した瞬間にログを自動記録する方法|変更履歴を残す便利マクロ

ExcelVBA

「誰がどのセルを変更したのかわからない…」
「値が勝手に書き変わっていて原因が追えない…」

Excelで複数人が編集する場面では、“変更履歴を自動で記録”できる仕組みがあると、とても便利です。

この記事では、セルを変更した瞬間にログシートへ自動で書き込む ExcelVBA マクロをご紹介します。

✔ いつ変更した?
✔ どのセルを変更した?
✔ 変更前の値は?
✔ 変更後の値は?

これをすべて「自動で」記録できるようになります。

完成イメージ(動画で確認)

セルを変更した瞬間にログを自動記録

目次

ログシートの準備

まず、新しいシートを作成して、シート名を「変更ログ」にします。
そして、1行目に各項目の名称を入力しておいてください。

入力シートの準備

新しいシートを追加してシート名を「入力」にします。

VBAコード(コピペOK)

① 標準モジュールに追加:変更前の値を保持する

Option Explicit
Public BeforeValue As Variant   ' 変更前の値を保存

② 対象シート(「入力」シート)のコードに貼る:変更前を取得

※これは「シートモジュール」に貼ります(標準モジュールではありません)
今回は「入力」シートのシートモジュールにコードを貼ってください。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    BeforeValue = Target.Value
End Sub

③ 同じシートに貼る:変更後をログに記録

②と同じように「入力」シートのシートモジュールにコードを貼ってください。

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim logWs As Worksheet
    Dim nextRow As Long

    Set logWs = ThisWorkbook.Worksheets("変更ログ")

    ' ログの次の書き込み行を取得
    nextRow = logWs.Cells(logWs.Rows.Count, 1).End(xlUp).Row + 1

    ' ログ書き込み
    With logWs
        .Cells(nextRow, 1).Value = Now                          ' 変更日時
        .Cells(nextRow, 2).Value = Me.Name                     ' シート名
        .Cells(nextRow, 3).Value = Target.Address              ' セル番地
        .Cells(nextRow, 4).Value = BeforeValue                 ' 変更前の値
        .Cells(nextRow, 5).Value = Target.Value                ' 変更後の値
    End With

End Sub

これで、対象シートのセルを変更しただけで、
自動的に「変更ログ」シートへ履歴が溜まっていきます。

コード解説(初心者向け)

① SelectionChange で「変更前の値」を記録

セルを選択したタイミングで、そのセルの「元の値」を覚えておきます。

BeforeValue = Target.Value

② Change イベントで「変更後の値」を取得

Target.Value

更新後の値と比較することで、変更履歴を残せるようになります。

③ ログシートの次の空行に追記

nextRow = logWs.Cells(logWs.Rows.Count, 1).End(xlUp).Row + 1

A列を基準に「空白でない最終行」を探し、次の行に書く仕組みです。 これにより、ログがどんどん下に溜まります。

応用テクニック(必要に応じて追加OK)

① 編集したユーザー名(Windowsログオン名)も記録したい

.Cells(nextRow, 6).Value = Environ("USERNAME")

ログインしているPCのユーザー名を記録できます。

② 特定の範囲だけログを取る

If Intersect(Target, Me.Range("A1:F100")) Is Nothing Then Exit Sub

③ 数式変更だけ記録したい/値入力だけ記録したい

If Target.HasFormula Then ...

④ 変更前後が同じ場合はログを書かない

If BeforeValue = Target.Value Then Exit Sub

注意点とマクロ実行手順

● 注意点

  • シートモジュールに貼るコードと標準モジュールのコードを混同しないよう注意
  • 大量の変更があるとログが増える(運用上の注意)
  • 複数のセルを一気に変更する操作(貼り付けなど)はログがやや不規則になる場合あり

● 実行手順

  1. ログシート「変更ログ」を作る
  2. 標準モジュールに「BeforeValue」を貼る
  3. 対象シートのシートモジュールに「SelectionChange」「Change」を貼る
  4. .xlsm 形式で保存する
  5. 対象シートでセルを変更して動作を確認する

まとめ:変更履歴の自動記録でミス防止・業務効率化

今回は、ExcelVBAを使ってセル変更のログを自動で記録するマクロをご紹介しました。

  • 変更前と変更後が自動で記録される
  • セル番地・日時・シート名も記録できる
  • 複数人で使うExcelで「誰が何を変えたか」が分かる

業務でのデータトラブル防止に、非常に使い勝手のよいマクロです。
ぜひあなたの環境にも取り入れてみてください。

コメント

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