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

标签 excel vba function user-defined-functions volatile

这是我的第一篇文章,因为在学习 VBA 的几年里,我总是能够找到所有问题的答案,因为其他人比我先找到了答案,而且 stackexchange 很出色。然而,我终于遇到了一些我找不到答案的事情......

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

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

希望和梦想: 我想知道如何强制我的 UDF 运行而不不稳定。

注意: 我已经尝试了所有我能找到的方法,但都没有成功,但我对想法持开放态度。 “.calculate”不起作用(除非我使用错误)。 “.calculate = ...automatic”也不起作用。创建一个“ volatile ”变量并在外部进行切换也不起作用。

另一个解决方案是暂时打开不同模块/子模块的函数波动性,但我不知道有什么方法可以做到这一点。

任何帮助将不胜感激。

谢谢!

最佳答案

(正如 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

关于excel - 如何在 MS Excel VBA 中强制更新函数 (UDF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48234548/

相关文章:

mysql - 游标的不一致行为

sql - Excel VBA 使用 InstantClient 连接到远程 Oracle 数据库

excel - 如果我的工作表有无效数据触发对话框

c++ - 错误: passing 'const S' as 'this' argument discards qualifiers

javascript - 如何通过 onclick-function 将选项列表中的值获取到连续的输入字段

vba - 发送带有附件的电子邮件 ..VBA 代码

oop - 可用的 OOP 概念列表

string - 使用带有 FormulaR1C1 的字符串变量有效,除非它以数字开头

excel - 如何将 IFERROR 应用于 Excel 中的所有单元格

arrays - 删除 Excel 中特定工作表的除第一行以外的所有内容