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

时间:2016-03-14 12:25:40

标签: excel vba excel-vba 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"), "")

公式本身并不重要,它是公式的作用。公式输出"是"在B10中,如果D10输入" 709A"。因此,根据我的知识,如果我输入" 709A"我将自动从我的宏中获取一个消息框。进入D10,因为它改变了B10的值。但我不是。如果公式本身发生变化,我只会得到一个消息框,即使输出(值/单元格中可见的内容 - 是否有技术标签?)也不会改变。如何创建一个自动告诉我单元格输出何时发生变化的宏?即:这告诉我输出已从""到"是"当D10输入" 709A"?

3 个答案:

答案 0 :(得分:2)

我能想到的一种解决方法是在Worksheet_Change事件中有一个变量数组,用于存储每个键单元格的.value或.value2属性,并将其与更改的单元格进行比较,然后触发您的消息盒那样。问题是代码非常笨拙,而且你开始观看的关键单元越多,就越笨重。

答案 1 :(得分:2)

与Roman B的建议类似的解决方法,但使用全局数组。激活工作表时,这会将值存储在B1:B10中,然后每次在工作表中进行更改时检查并更新。这可能不是一个理想的解决方案,但似乎只需要检查10个单元格即可。

somepatches = [patch for k,patch in enumerate(patches) if k in indice]
collection = PatchCollection(somepatches, facecolor='none',
                  edgecolor='grey', linewidths=1.5, zorder=2, alpha=0.8)
ax.add_collection(collection)

答案 2 :(得分:1)

可以访问单元格的FormulaTextValueValue2属性。您需要指定单元格的ValueValue2,如果您使用格式化文本,则需要Text

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