代码之家  ›  专栏  ›  技术社区  ›  Przemyslaw Remin

如何检查Excel表格单元格是否已被用户编辑?

  •  1
  • Przemyslaw Remin  · 技术社区  · 6 年前

    在Excel表中有哪些选项可以监视更改?

    我能想到的可能的解决方案是复制表,比如在隐藏的工作表和比较两个工作表的公式中。

    还有别的办法吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Error 1004    6 年前

    我完全同意@micha_出于安全原因,最好保留有关更改的记录。你可以使用:

    Option Explicit
    Dim OldValue As String
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        MsgBox "The old value was " & OldValue & "." & vbNewLine & _
                "The new value is " & Target.Value & "." & vbNewLine & _
                "Date of change " & Now & "." & vbNewLine & _
                "Change by " & Environ$("computername") & "."             
    
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
        OldValue = Target.Value
    
    End Sub
    
        2
  •  2
  •   Michał Turczyn    6 年前

    嗯,有多种方法。

    在路上会订阅 Worksheet_Change 采用这种方法的事件:

    Private Sub Worksheet_Change(ByVal Target As Range)
        'some code, which will compare values and store info in a file
    End Sub
    

    我还建议了记录此类事件的方法:取用户名和已更改的内容,并将此信息写入文件。

    此外,您还需要进行一些额外的编码,看看这是否是您感兴趣的更改,但这是留给您去发现的,因为在这里广泛地描述所有选项:)

        3
  •  2
  •   MrZH6    6 年前

    我想出了一个代码(基于事件的代码-工作表更改),如下所示:

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rg As Range
    Set rg = Cells
    Dim lastrow As Long
    Dim username As String
    
    
    If Intersect(Target, rg) Is Nothing Then Exit Sub
    
    On Error GoTo ExitHere
    
    Application.EnableEvents = False
    
    With SomeOtherSheet
        lastrow = .Cells(.Rows.Count, "H").End(xlUp).Row
        .Range("H" & lastrow + 1) = Now
        .Range("I" & lastrow + 1) = Target.Address
        .Range("J" & lastrow + 1) = Environ("Username")
        .Range("K" & lastrow + 1) = Application.username
    End With
    
    ExitHere:
    Application.EnableEvents = True
    End Sub
    

    它将用户所做的任何更改记录在给定的工作表中(编写代码的工作表)。它将在另一张纸上显示更改的对象、时间和地点。我对此唯一的问题是用户必须启用宏,否则它将不起作用…我不知道如何合理地解决这个问题…