【问题标题】:Excel VBA code for an audit trail. How to record deletion?用于审计跟踪的 Excel VBA 代码。如何记录删除?
【发布时间】:2021-03-01 08:23:25
【问题描述】:

我有一些代码(不是我的),用于 Excel 中的简单审计记录器,用于记录对单元格的更改,因为它们发生在名为“日志”的工作表中。它适用于所有实例,除非用户删除单元格以将其留空。在这种情况下,它什么也不记录。我不确定这是为什么。任何人都可以帮助更新代码,以便它记录用户何时删除单元格中的数据以留空?先感谢您!詹姆斯

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Value <> PreviousValue Then
    Sheets("log").Cells(65000, 1).End(xlUp).Offset(1, 0).Value = _
        Application.UserName & " changed data in cell " & Target.Address _
        & " in sheet " & ActiveSheet.Name & " from <" & PreviousValue & "> to <" & Target.Value & ">" & " at " & Time & " on " & Date
    End If
End Sub

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


【问题讨论】:

  • 是整个代码吗?我想你错过了Public PreviousValue As String。尝试将它放在模块的开头(在任何其他宏之前)。
  • 对不起,是的。一开始我有“Dim PreviousValue”。
  • 不是Dim,是Public。它必须放在任何宏之外。
  • 谢谢。我删除了该行并添加了您的行。它会导致倒数第二行出现类型不匹配错误。
  • 嗯,猜猜您可能曾尝试一次编辑多个单元格。我会尽快尝试。

标签: excel vba


【解决方案1】:

只要单元格中文本的总长度(或其数量)不太长,这应该可以工作:

Option Explicit
Public StrPrevious As String
Public StrMarker As String

Private Sub Worksheet_Change(ByVal Target As Range)
    
    'Declarations.
    Dim RngCell As Range
    Dim DblCounter01 As Double
    
    'Covering each cell in Target.
    For Each RngCell In Target.Cells
        
        'Checking if the value has changed.
        If RngCell.Value <> Split(StrPrevious, StrMarker)(DblCounter01) Then
            
            'Reporting the change.
            Sheets("log").Cells(65000, 1).End(xlUp).Offset(1, 0).Value = Application.UserName & _
                                                                         " changed data in cell " & _
                                                                         RngCell.Address & _
                                                                         " in sheet " & _
                                                                         ActiveSheet.Name & _
                                                                         " from <" & _
                                                                         Split(StrPrevious, StrMarker)(DblCounter01) & _
                                                                         "> to <" & _
                                                                         RngCell.Value & _
                                                                         ">" & _
                                                                         " at " & _
                                                                         Time & _
                                                                         " on " & _
                                                                         Date
        End If
        
        'Setting DblCounter01 for the next cell.
        DblCounter01 = DblCounter01 + 1
        
    Next
    
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Declarations.
    Dim RngCell As Range
    
    'Setting.
    StrPrevious = ""
    StrMarker = " | "
    
    'Covering each cell in Target.
    For Each RngCell In Target
        
        'Filling StrPrevious with Target's cell contents.
        StrPrevious = StrPrevious & RngCell.Value & StrMarker
        
    Next
    
End Sub

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 2021-07-04
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多