一种可能的解决方法来自这样一个事实,即要更改一个值,用户需要先更改选择。所以我会:
1) 在 WS 源代码模块之上声明一个名为“oldValue”的全局变量:
Dim oldValue As Variant
2) 在用户输入任何内容之前注册公式的旧值(假设它在 Range("A4") 中,我让你适应其他人):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Range("A4")
End Sub
3) 检查更改是否影响了 Change 事件中的公式:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("A4") <> oldValue Then
MsgBox "User action has affected your formula"
End If
End Sub
我已经用一个简单的总和进行了测试,我可以在没有任何提示的情况下编写不涉及的单元格,但是如果我触摸总和中涉及的单元格之一,MsgBox 就会出现。我让您适应多种情况,用于用户添加/删除行(在这种情况下,我建议命名包含您要跟踪的公式的范围)和工作表引用。
编辑 我想一次完成,而不是通过 2 个过程,可以吗?问题是我的宏涉及一个包含多个单元格的范围,因此很难存储 10 个单元格的旧值。
如果范围彼此相邻,则可以使用集合代替变量:
Dim oldValues As New Collection
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
For j = 1 To 10
oldValues.Add Range("A" & j).Value
Next j
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
For j = 1 To 10
If Range("A" & j).Value <> oldValues(j) Then
MsgBox "The value of Range(A" & j & ") has changed"
End If
Next j
End Sub
当然,如果范围彼此不接近,您可以将它们存储在 SelectionChange 事件中,如下所示:
oldValues.Add Range("A1").Value
oldValues.Add Range("B7").Value
'...
如果您这样做了一次,只有 10 个范围,它应该是您问题的合理解决方案。