这是我的第一篇文章,因为在学习 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/