自动重新评估非易失性 UDF

Posted

技术标签:

【中文标题】自动重新评估非易失性 UDF【英文标题】:Re-evaluate non volatile UDF automatically 【发布时间】:2015-09-15 08:11:27 【问题描述】:

假设,我们有以下非易失性 UDF:

Function Twice(ByRef x As Double) As Double
    Application.Volatile False
    Twice = 2 * x
End Function

我们在单元格A1 中输入,参考单元格A2,即在A1 中我们输入:

= Twice(A2)  

此外,我们在A2 中放入了随机函数,即在A2 中我们放入了:

=RAND()  

现在,如果我们重新计算工作表(例如,通过按 Shift + F9),单元格 A2 中的值将会改变,但 UDF不会更新,即使其引用已更改。

当它的参考值改变时,我们如何使这个UDF自动更新(即不按Ctrl+Alt+F9)? p>

【问题讨论】:

按照@pnuts 的建议删除Application.Volatile False 行,并将工作簿的计算设置为自动而不是手动 @pnuts 不明确声明 Application.Volatile False 与声明它相同,因为它是默认设置。我只是把它放在这里是为了明确表示我不希望函数是易变的。 将 x 定义为 Variant 请不要更改编辑。您的问题标题不应包含描述。帖子区域就是为此。 @pnuts 我希望 UDF 仅在它所引用的单元格中的值(在示例单元格 A2 中)更改时才更改。我不希望它发生变化,比如单元格 A3 中的值发生变化,如果函数是 volatile 会发生这种情况。 【参考方案1】:

当您将 Application.Volatile False 与引用 volatile 公式的 Double 参数一起使用时,我认为这是一个错误。

如果您删除 Application.Volatile False 语句,它可以正常工作。

见https://fastexcel.wordpress.com/2011/09/05/false-volatility-is-this-a-bug/ 有关此问题的更详细讨论以及有关原因的推测。

【讨论】:

感谢您的回答。此解决方案(以及将参数定义为变体)已在 cmets 中提供给 OP,但我会接受您的回答以结束此问题,因为它提供了更多详细信息并承认这种“奇怪”行为。

以上是关于自动重新评估非易失性 UDF的主要内容,如果未能解决你的问题,请参考以下文章

优化volatile变量

将易失性数组转换为非易失性数组

将易失性数组与非易失性数组进行比较

如果我编辑另一个工作表并切换回来,则不显示易失性 UDF 的结果

everspin非易失性存储器中MRAM的潜在用途

展望由非易失性设备构成的未来存储