替代 Application.Volatile 以自动更新 UDF [重复]

Posted

技术标签:

【中文标题】替代 Application.Volatile 以自动更新 UDF [重复]【英文标题】:Alternative to Application.Volatile to auto update UDF [duplicate] 【发布时间】:2014-08-05 18:17:41 【问题描述】:

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

您可能已经发现更改单元格的内部颜色不会触发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

【讨论】:

以上是关于替代 Application.Volatile 以自动更新 UDF [重复]的主要内容,如果未能解决你的问题,请参考以下文章

刷新 Excel VBA 函数结果

替代正则表达式以解析链接的 HTML 页面 [重复]

是否有必要安装 Android Studio 以实现颤振或啥可以替代 android studio?

寻找 MySQL Workbench 的替代品以与 MariaDB 10 一起使用

以编程方式为 UITableViewCell 设置 LayoutMargins - iOS 7 替代方案

替代 COUNT 用于 innodb 以防止表扫描?