Excelは何でもできるので神!って思っている人多いですね。ただ、Web系アプリやインストール系のプログラムに埋め込まれているLOG(ログ)と呼ばれる 編集履歴 が残らない(自分が知らないだけ?)ので、誰が編集したかわからなくなりますよね? VBA で自動で履歴を 残す ことができたらって思ったことありませんか?
やりたいこと
自動的に履歴(ログ)を残す。(編集制御あり)
手段
Workbook_Sheet~というイベントプロシージャを使って、Workbookで行われたイベント(処理)を記録して、LOGシートに記載していきます。
注意点としては、Excelデータ全体に関連するマクロとなるので、ThisWorkbookに記載することです。

サンプルソース(コード)
Dim Log As Variant
'宣言セクション(Moduleの一番上に記載する)
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) '----(1)
Log = Target.Value
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) '----(2)
Dim clm As Long
Application.EnableEvents = False '----(3)
With Worksheets("LOG") '----(4)
clm = .Cells(Rows.Count , 1).End(xlUp).Row + 1
.Cells(clm , 1).Value = Sh.Name
.Cells(clm , 2).Value = Target.Address
.Cells(clm , 3).Value = LOG
.Cells(clm , 4).Value = Target.Value
.Cells(clm , 5).Value = Now
.Cells(clm , 6).Value = Application.UserName
End With
Application.EnableEvents = True '----(3)
'LOGシートの編集にはパスワードが必要 '----(5)
If Sh.Name = "LOG" Then
If InputBox("パスワードを入力してください") <> "password" Then
MsgBox "パスワードが正しくありません"
Application.Undo
End If
End If
End Sub
- (1)いずれかのシートで変更が発生した場合に変更前情報を”LOG”に値を記録します
- (2)(1)に連動して変更された後にLOGシートに記録を残します。
- (3)(2)の動作もExcelの変更処理の対象となります。その処理は除外すべくイベントとして除外するためのコードです。
- (4)LOGシートに【変更シートの名前】【変更セルのアドレス】【変更前の値】【変更後の値】【変更日時】【変更者】を記録します。
- (5)LOGシートを編集しようとした場合、パスワードを求められ、パスワードが一致しなければ、編集できません。(上記サンプルのパスワードは password)
※事前準備として、データシート以外に”LOG”というシートと下図の様なタイトルを記載しておきます。

問題なければ、下記のように入力した処理の履歴が残ります。

これがあれば、悪いことできませんね・・・
と悪いことを前提にしてしまっていますが、意図せず変わってしまったり履歴を自動的に残すなど、便利なことが実現可能です。
うまく流用できれば、特定セルを入力したときの更新者を入力するなどできますよ。