Excel

編集履歴 を 残す のは誰でもできます!【Excel VBA 】

Kuni.W

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”というシートと下図の様なタイトルを記載しておきます。

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


これがあれば、悪いことできませんね・・・

と悪いことを前提にしてしまっていますが、意図せず変わってしまったり履歴を自動的に残すなど、便利なことが実現可能です。

うまく流用できれば、特定セルを入力したときの更新者を入力するなどできますよ。

ABOUT ME
記事URLをコピーしました