Application.Volatile的替代方案,可自动更新UDF

时间:2014-08-05 18:17:41

标签: excel vba excel-vba

我有一个从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

此功能的要求是,当单元格的颜色值发生变化时,它将更新。

我的想法是创建一个事件,以便何时更改单元格的颜色并重新计算具有该功能的任何单元格,但我不确定这是否是最好的方法。

1 个答案:

答案 0 :(得分:3)

您可能已经发现更改单元格的内部颜色不会触发Sub Worksheet_Change(...)。由于没有更改任何值,因此不会重新计算任何值。在这种情况下,即使Application.Volatile也没有帮助。

最好的方法可能是使用Worksheet_SelectionChange(...),最终与Worksheet_Activate(...)Worksheet_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