Vba 应用程序的替代方案。用于自动更新自定义项的Volatile

Vba 应用程序的替代方案。用于自动更新自定义项的Volatile,vba,excel,Vba,Excel,我有一个来自MSDN的函数,它计算一个区域中具有另一种单元格颜色的单元格数量 这是密码 Function countCcolor(range_data As Range, criteria As Range) As Long Application.Volatile Application.ScreenUpdating = False Dim datax As Range Dim xcolor As Long xcolor = criteria.Interior.

我有一个来自MSDN的函数,它计算一个区域中具有另一种单元格颜色的单元格数量

这是密码

Function countCcolor(range_data As Range, criteria As Range) As Long
    Application.Volatile
    Application.ScreenUpdating = False
    Dim datax As Range
    Dim xcolor As Long
xcolor = criteria.Interior.ColorIndex
For Each datax In range_data
    If datax.Interior.ColorIndex = xcolor Then
        countCcolor = countCcolor + 1
    End If
Next datax
Application.ScreenUpdating = True
End Function
此函数的一个要求是,当单元格的颜色值发生变化时,它将更新


我的想法是在单元格颜色发生变化时创建一个事件,并让它使用函数重新计算任意单元格的颜色,但我不确定这是否是最好的方法。

您可能已经发现,更改单元格的内部颜色不会触发子工作表更改(…)。由于未更改任何值,因此不会重新计算任何内容。在这种情况下,即使是
应用程序.Volatile
也没有帮助

最好的方法可能是使用
工作表\u SelectionChange(…)
,最终与
工作表\u Activate(…)
工作表\u Deactivate(…)
(在进入和离开时将工作表清理干净)结合使用,以强制重新计算,例如

Sub DoMyRecalc()
    ' Range("OutputRange").Calculate ' all uses of countCcolor() within that range
    ' [H3].Calculate                 ' countCcolor() only used in cell H3
End Sub


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    DoMyRecalc
End Sub

Private Sub Worksheet_Activate()
    DoMyRecalc
End Sub

Private Sub Worksheet_Deactivate()
    DoMyRecalc
End Sub