通过编辑检测是否实际更改了单元格值

use*_*488 11 excel vba excel-vba

Worksheet_Change 当一个单元格值发生变化时触发(这就是我想要的),但是当你输入一个单元格时它也会触发,就像编辑它一样,但实际上并没有改变单元格的值(这就是我不希望发生的事情) ).

假设我想为值已更改的单元格添加着色.所以我编码:

Private Sub Worksheet_Change(ByVal Target As Range)
    Target.Interior.ColorIndex = 36
End Sub
Run Code Online (Sandbox Code Playgroud)

现在来测试我的工作:更改单元格A1并突出显示单元格.这是理想的行为.到现在为止还挺好.然后,双击B1但不更改其中的值,然后单击C1.你会注意到B1被突出显示!这不是理想的行为.

我是否必须完成此处讨论的捕获旧值的方法,然后在突出显示单元格之前将旧旧比较?我当然希望有一些我不知道的东西.

Jea*_*ett 5

我建议在另一个工作表中自动维护工作表的“镜像副本”,以便与更改的单元格的值进行比较。

@brettdj 和 @JohnLBevan 本质上建议做同样的事情,但他们分别将单元格值存储在注释或字典中(并且确实为这些想法+1)。不过,我的感觉是,从概念上讲,在单元格中备份单元格比在其他对象中备份单元格要简单得多(尤其是注释,您或用户可能希望将其用于其他目的)。

因此,假设我有Sheet1用户可以更改其单元格的信息。我创建了另一个名为的工作表Sheet1_Mirror(您可以在其中创建Workbook_Open,并且如果您愿意,可以将其设置为隐藏 - 由您决定)。首先, 的内容Sheet1_Mirror将与 的内容相同Sheet1(同样,您可以在 处强制执行此操作Workbook_Open)。

每次Sheet1'Worksheet_Change被触发时,代码都会检查 中“更改的”单元格的值是否Sheet1实际上与 中的值不同Sheet1_Mirror。如果是这样,它会执行您想要的操作并更新镜像表。如果没有,那就没什么了。

这应该会让你走上正轨:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    For Each r In Target.Cells
        'Has the value actually changed?
        If r.Value <> Sheet1_Mirror.Range(r.Address).Value Then
            'Yes it has. Do whatever needs to be done.
            MsgBox "Value of cell " & r.Address & " was changed. " & vbCrLf _
                & "Was: " & vbTab & Sheet1_Mirror.Range(r.Address).Value & vbCrLf _
                & "Is now: " & vbTab & r.Value
            'Mirror this new value.
            Sheet1_Mirror.Range(r.Address).Value = r.Value
        Else
            'It hasn't really changed. Do nothing.
        End If
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)