有些时候,在实际办公过程中,同一份表单可能需要经由多个不同的人员修改审批。而随着时间的推移,对于每个人具体修改了什么内容,修改是否合理我们无从得知。对于 Excel 本身,每一次修改的记录也得不到保存。当然,对于大部分表单来说这样大大提高了软件性能,但是对于一些特别重要的表单,修改记录还是比较重要的,本文就简单说下如何自动检测并保存 Excel 表单修改记录。

首先我们需要有一个用于记录数据的 Sheet,命名数据区域 “dataRng” 如下图所示:

然后我们需要增加一个用于记录数据的 Sheet,将以下代码复制到对应 Sheet 页中以监控该页面数据修改记录,命名数据区域“recordRng”,如下图所示。

最后记录数据修改的代码如下:

模块代码
Public dataRng, targetAddress, oldValue, recordSheet, recordRng

' 记录工作簿修改信息
Public Function UpdateRecord(dataRng, targetAddress, oldValue, recordSheet, recordRng)

    On Error Resume Next
    For Each rngCell In Range(dataRng)
    If targetAddress = rngCell.Address And oldValue <> "" Then
        With ThisWorkbook.Worksheets(recordSheet).Range(recordRng)
        If oldValue <> Range(targetAddress).Value Then

            .Rows(2).Insert Shift:=xlDown
            .Rows(3).Copy
            .Rows(2).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            Application.CutCopyMode = False

            .Cells(2, 1) = Range(targetAddress).Address
            .Cells(2, 2) = Cells(5, Range(targetAddress).Column)
            .Cells(2, 3) = oldValue
            .Cells(2, 4) = Range(targetAddress).Value
            .Cells(2, 5) = Date

        End If
        End With


    End If
    Next

End Function
Sheet引用
' 请求记录数据修改函数记录数据
Sub Worksheet_Change(ByVal Target As Range)
    Call UpdateRecord(dataRng, targetAddress, oldValue, recordSheet, recordRng)
End Sub
' 检测单元格变化获取原始信息
Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    dataRng = "dataRng"
    oldValue = Target.Value
    targetAddress = Target.Address
    recordSheet = "修改记录"
    recordRng = "recordRng"

End Sub

以上。