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

时间:2019-01-28 11:59:40

标签: excel vba excel-tables

监视Excel表中的更改的选项有哪些?

我可能想到的解决方案是在隐藏的工作表中提供表的克隆副本,并在公式中将两个表进行比较。

还有其他方法吗?

3 个答案:

答案 0 :(得分:2)

嗯,有多种方法。

正在使用的方法是订阅Worksheet_Change事件:

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

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

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

答案 1 :(得分:2)

我想出了一个这样的代码(作为基于事件的代码-Worksheet_Change):

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

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

答案 2 :(得分:1)

我完全同意@MichałTurczyn的观点。出于安全原因,最好保留有关更改的记录。您可以使用:

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