首页 > 解决方案 > 坚持使用 excel 审计历史跟踪器

问题描述

我正在尝试组合一个审计跟踪器,以便我可以知道人们何时更改了共享文件。我想我已经接近了,但就是无法越界!
在三种情况下,VBA 应通过在“用户日志”表中输入用户详细信息和更改的详细信息来提醒“客户数据”表中的任何更改:

  1. 当有人覆盖现有数据时
  2. 当有人删除一行时
  3. 当有人添加一行时

我已经想出了如何做 1 或 2&3,但不能将它们结合在一起。

它取自几个不同的来源,可以解释任何不一致之处(另外我还在学习)。

我当前的代码如下:

Dim PreviousValue

Private Sub worksheet_selectionchange(ByVal target As Range)
    'reset previous val
    PreviousValue = target.Value
End Sub

Private Sub Worksheet_Change(ByVal target As Range)
    Static lngRow As Long
    Dim rng1 As Range
    Dim i As Long
    Dim ws As Worksheet
    Set ws = Sheets("User Log")
    Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange

    If lngRow = 0 Then
        lngRow = rng1.Row
        Exit Sub
    End If

    i = ws.Range("A" & Rows.Count).End(xlUp).Row + 1

    'track a row deletion

    If rng1.Row < lngRow Then
        With ws
            .Range("A" & i).Value = Application.UserName
            .Range("B" & i).Value = ActiveSheet.Name
            .Range("E" & i).Value = "Row Removed"
            .Range("F" & i).Value = Format(Now(), "dd/mm/yyyy, hh:mm:ss")
        End With
        Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange
    End If

    'track a row addition

    If rng1.Row > lngRow Then
        With ws
            .Range("A" & i).Value = Application.UserName
            .Range("B" & i).Value = ActiveSheet.Name
            .Range("E" & i).Value = "Row Added"
            .Range("F" & i).Value = Format(Now(), "dd/mm/yyyy, hh:mm:ss")
        End With

        Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange
    End If

    'track an overwrite
    If rng1.Row = lngRow Then
        With ws
            .Range("A" & i).Value = Application.UserName
            .Range("B" & i).Value = ActiveSheet.Name
            .Range("C" & i).Value = target.Address
            .Range("D" & i).Value = PreviousValue
            .Range("E" & i).Value = target.Value
            .Range("F" & i).Value = Format(Now(), "dd/mm/yyyy, hh:mm:ss")
        End With
    End If
End Sub

当我覆盖现有数据时,这开始起作用,但是只要我添加一行,它就会记录下来,但随后会卡住,任何其他更改都会显示为“添加的行”。它(现在)根本不跟踪行删除。非常感谢任何帮助!

标签: excelvba

解决方案


推荐阅读