【问题标题】:Excel Macro event not working after saving data保存数据后 Excel 宏事件不起作用
【发布时间】:2023-12-01 05:33:01
【问题描述】:

我的宏功能是:

Function IsColouredCell(Range As Range, Colour As Range) As Boolean
If Range.Interior.Color = Colour.Interior.Color Then IsColouredCell = True
End Function

而事件代码是:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Calculate
End Sub

用例:检查目标和参考单元格的颜色匹配。

上述代码一直处于活动状态,直到我在 vba 中为 excel 中的 n 个条目编写代码后才使用它。但是,一旦我将数据保存在已保存的宏文件上。我的事件激活不起作用,并且在更改单元格颜色时没有任何反应。

请提供解决方案。

【问题讨论】:

    标签: excel vba function events activation


    【解决方案1】:
    1. 您不能在Range As Range 中声明变量名称Range。这非常令人困惑,可能会弄乱代码。永远不要使用保留字作为变量名。 VBA 中的所有名称最好是唯一的。

    2. 如果将其用作 UDF(用户定义的函数)(如公式),您可能需要将其设为 volatile,因为它仅在任何依赖值发生变化时重新计算 ActiveSheet.Calculate,但在单元格颜色发生变化时不会重新计算:

    所以它应该如下所示:

    Function IsColouredCell(ByVal MyRange As Range, ByVal Colour As Range) As Boolean
        Application.Volatile
        If MyRange.Interior.Color = Colour.Interior.Color Then IsColouredCell = True
    End Function
    

    如果您像=IsColouredCell(A1,B1) 一样使用它并且它不是易失性的,则该公式仅在A1B1 更改时重新计算。但如果只是他们的颜色改变了,它就不会重新计算,即使ActiveSheet.Calculate没有。

    请注意,将函数设为 volatile 意味着 每次 Excel 都需要计算一些东西。因此,大量使用 volatile 函数会使您的工作表越使用该函数越慢。

    【讨论】:

    • 感谢您的解决方案。有效。但是有没有什么方法,只有当我改变颜色或数据时,excel才会重新计算,否则它不应该检查计算。
    • @AnkurBajaj 不,当您更改颜色时不会触发任何事件。如果您更改单元格 Worksheet_Change() 的值,则只有一个事件。请注意,如果单元格的值由于公式而发生更改,则不会触发此更改事件,它只会触发常量值更改(由用户或 VBA)。
    • @AnkurBajaj 如果这回答了您的问题,请投票/标记为已解决:Accepting Answers: How does it work?