【问题标题】:How to Force a Function (UDF) Update in MS Excel VBA如何在 MS Excel VBA 中强制更新函数 (UDF)
【发布时间】:2018-06-22 09:43:23
【问题描述】:

这是我的第一篇文章,因为在学习 VBA 的几年中,我总是能够找到我所有问题的答案,因为有人比我更胜一筹,而且 stackexchange 很牛。然而,我终于遇到了一些我找不到任何答案的事情......

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

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

希望和梦想: 我想知道如何强制我的 UDF 运行而不会发生波动。

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

另一种解决方案是从不同的模块/子中临时打开函数波动,但我不知道有什么方法。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • Application.Calculate 应该是您所需要的。如果没有,请尝试Application.CalculateFull
  • Application.Calculate 不起作用,但 Application.CalculateFull 完全符合我的需要!谢谢!!!
  • 最简单的解决方案是将 UDF 使用的范围作为参数传递给 UDF - 这样,每当重新计算/修改任何相关单元格时,Excel 都会重新调用 UDF。
  • Ctrl+Alt+Shift+F9

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


【解决方案1】:

(正如 K.Davis 所说,xlLogan 在上面的 cmets 中批准)Application.Calculate 或(如果不工作)Application.CalculateFull 在许多情况下可以提供帮助。

但有时可能需要(另外)将一些 UDF(s) 标记为 volatile(xlLogan 明确地做了/不能做),尤其是(就像我在另一种情况下所做的那样)当工作表公式和 VBA 代码之间的依赖关系是双向的时(就像在我的情况下不依赖于某些工作表更改,但例如在 excel 文件名上,这可能在两次打开期间已更改并且在 @987654324 期间被识别和处理@事件):

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

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 2010-09-09
    • 2018-11-18
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多