如何在MS Excel VBA中强制执行函数(UDF)更新

时间:2018-01-12 21:55:22

标签: excel vba function user-defined-functions volatile

这是我的第一篇文章,因为在几年学习VBA的过程中,我总能找到所有问题的答案,因为有些人打败了我,因为stackexchange摇滚。但是,我终于碰到了一些我找不到任何答案的东西......

背景: 我有一个非常复杂的Excel工作簿,非常VBA密集(很多循环和自动潜艇)。我对从VBA引用单元格非常谨慎,因为如果有人在没有更新VBA代码的情况下移动单元格,则会出现问题。但是,我有一些需要完成的计算,这些计算对于单元格公式来说太复杂了,所以我已经为这些事情创建了函数。这可以避免任何篡改问题,并为我提供所需的力量。

问题: 但问题是,由于工作簿非常复杂,如果我使UDF易变,他们将锁定工作簿,因为它只是循环到大量数据。 但如果我不让它们变得不稳定,那么函数值就不会在单元格中更新。

希望与梦想: 我想知道如何强制我的UDF运行而不会动荡。

注意: 我尝试过的所有事情都没有成功,但我对创意持开放态度。 " .calculate"不起作用(除非我错误地使用它)。 " .calculate = ...自动"也不起作用。创建一个" volatile"变量和我在外部切换也不起作用。

另一个解决方案是暂时从不同的模块/子开启函数波动,但我不知道如何做到这一点。

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

(如K.Davis所说,xlLogan已在上面的评论中批准) Application.Calculate或(如果不起作用的话)Application.CalculateFull 在许多情况下都可以提供帮助。

但是有时有时有必要(另外)将某些 UDF标记为volatile (xlLogan明确/不能这样做),尤其是(类似于另一种情况)在工作表公式与VBA代码之间是双向依赖关系时(例如,在我的情况下,不依赖于工作表更改,而是例如excel文件名),这可能在两次打开期间已更改,并且在Workbook_Open()事件):

Sub Foo()
    Application.Volatile  '=> so this sub/function is not considered entirely dependent (deterministic)
                          '   on some cells only, but on other "background" conditions as well
    ...
End Sub

在某些(可能很昂贵的)重新计算触发操作/更改(例如,也可能通过用户对话框/按钮)期间,明确禁用和启用事件可以帮助管理性能问题,例如使用(一些通常适用的功能):

'used with EventsEnable()
Sub EventsDisable()
    With Application: .EnableEvents = False:  .ScreenUpdating = False:  .Calculation = xlCalculationManual:  End With
End Sub


'used with EventsDisable()
Sub EventsEnable()
    With Application:  .EnableEvents = True:  .ScreenUpdating = True:  .Calculation = xlCalculationAutomatic:  End With
End Sub