Worksheet_Change
在单元格值更改时触发(这就是我想要的),但当您输入单元格就像编辑它但实际上并未更改单元格的值时,它也会触发(这就是我不想发生的事情)。
假设我想向值已更改的单元格添加底纹。所以我编写了这样的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Interior.ColorIndex = 36
End Sub
现在测试我的工作:更改单元格 A1,该单元格将突出显示。这就是所需的行为。到目前为止,一切都很好。然后,双击 B1 但不要更改那里的值,然后单击 C1。您会注意到 B1 被突出显示!这不是期望的行为。
我是否必须执行此处讨论的捕获旧值的方法,然后在突出显示单元格之前将旧值与新值进行比较?我当然希望我遗漏了一些东西。
最佳答案
我建议在另一个工作表中自动维护工作表的“镜像副本”,以便与更改的单元格的值进行比较。
@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
关于vba - 检测单元格值是否确实通过编辑而更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064439/