PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやプランナーなども

セルの変更履歴を保存する方法 【エクセル・VBA】

こんにちは、PeaceJetです。

今日は、久々にプログラミング的な記事を書きます。

セルの変更履歴を別のシートに記録したい

複数人数によって共有されるエクセルブックの場合、「いつ? 誰が? どの部分を変更したのか?」を追跡したいと言った需要が生まれることがあります。

そこで、今回は「変更履歴を別のエクセルシートへ記録する」というプログラムをご紹介します。

用意するもの

  1. "変更履歴"というシート

以下は、変更されるシートのモジュールに記述して下さい。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim X As Integer, Y As Integer
    Dim LastRow As Long
    
    X = Target.Column
    Y = Target.Row
    
    If Worksheets("変更履歴").Range("A" & Rows.Count).End(xlUp).Row = Rows.Count Then
    
    Exit Sub
    
End If
    
With Worksheets("変更履歴")
    LastRow = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("A" & LastRow) = Now()
    .Range("B" & LastRow) = Target.Address(Y, X)
    .Range("C" & LastRow) = Cells(Y, X)
    .Range("D" & LastRow) = UserInfo(0)
    .Range("E" & LastRow) = UserInfo(1)
End With

End Sub

以下は、標準モジュールに記述してください。

function UserInfo()

    Dim MyArray(2) as Variant

    Dim WshNetworkObject As Object
    Set WshNetworkObject = CreateObject("WScript.Network")
 
    With WshNetworkObject

        MyArray(0) = .UserName 'ユーザー名
        MyArray(1) = .ComputerName 'コンピュータ名

    End With

    UserInfo = MyArray    

    Set WshNetworkObject = Nothing

End function