macros查看单元格的输出而不是公式

我已经使用了微软网页上的代码,以便每当我的范围内的一个单元格发生变化时,一个消息框会自动告诉我发生了这种情况。 该页面是: https : //support.microsoft.com/en-us/kb/213612

我复制和粘贴的代码是(我已经非常轻微地编辑它 – 编辑在下面的代码中):

Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range ' The variable KeyCells contains the cells that will ' cause an alert when they are changed. Set KeyCells = Range("B1:B10") If Not Application.Intersect(KeyCells, Range(Target.Address)) _ Is Nothing Then ' Display a message when one of the designated cells has been ' changed. ' Place your code here. MsgBox "Cell " & Target.Address & " has changed." End If End Sub 

但是这个代码并没有做我想做的事情。 在B10里面我有公式:

 =IF(D10="709A", IF(AND(D10="709A"), "Yes", "No"), "") 

公式本身并不重要,公式就是这样。 如果D10input“709A”,则公式在B10中输出“是”。 因此,据我所知,如果我在D10中input“709A”,我会自动从我的macros中得到一个消息框,因为它改变了B10的值。 但我不知道 如果公式本身发生变化,我只会得到一个消息框,即使输出(值/单元格中显示的内容 – 有没有技术标签?)不会改变。 我怎样才能创build一个macros自动告诉我什么时候一个单元格的输出更改? 即:当D10input“709A”时,告诉我输出从“”变为“是”?

罗马B的build议类似的解决方法,但使用全局数组。 当您激活工作表时,将这些值存储在B1:B10中,然后每次在工作表中进行更改时都会检查并更新。 这可能不是一个理想的解决scheme,但似乎它可以做的工作,只是检查10个单元格。

 Option Explicit Option Base 1 Dim globalArray(10) Sub Worksheet_Activate() Dim i As Long For i = 1 To 10 globalArray(i) = Cells(i, 2) Next i End Sub Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long For i = 1 To 10 If globalArray(i) <> Cells(i, 2) Then ' Do stuff here ' globalArray(i) = Cells(i, 2) End If Next i End Sub 

我能想到的解决方法是在Worksheet_Change事件中有一个variables数组,它将存储每个关键单元的.value或.value2属性,并将其与已更改的单元格进行比较,然后以这种方式触发消息框。 问题是代码非常糟糕,并且可能会让你开始看更多的关键单元变得庞大。

可以访问单元格的FormulaTextValueValue属性。 您需要指定单元格的ValueValue ,或者如果您在格式化文本之后指定文本。

MSDN页面有关于这些范围成员的更多信息。 此页面解决属性之间的差异。