【问题标题】:Application.Volatile: Why Doesn't It Work as Expected?Application.Volatile:为什么没有按预期工作?
【发布时间】:2017-07-10 19:22:54
【问题描述】:

我创建了一个函数,保存在主模块中,如下:

Public Function Teste() As Variant
    Application.Volatile
    MsgBox "rodou"
    Teste = ""
End Function

计算选项设置为自动。在单元格中,我放置了公式(例如。=Teste()),期望 Teste 函数会运行,每次我会修改任何单元格,因为 Application. Volatile 将我的函数设置为 Dirty,强制 Excel 运行该函数。

发生的情况是不会调用 Teste 函数,除非我将任何将要更新的单元格放在工作表的 Change 事件中(例如 =Teste(B2)).

我想要的只是每次在工作表中进行更改时运行 Teste 函数。

提前致谢。

【问题讨论】:

  • @Gary'sStudent 这是不对的。 Excel 会根据任何工作簿中任何单元格的任何更改重新计算易失函数。这种行为正是Volatile 的重点。事实上,我无法重现 OP 的问题,每当我更改任何单元格时,我都会收到消息框。
  • 文档说:“如果它不在用户定义的函数中用于计算工作表单元格,则此方法无效。”。问题是这是否意味着该函数是在工作表单元格中使用还是该函数在其代码中修改(另一个)工作表单元格。Excel可以在编译时知道该函数是否执行。此函数不会修改其代码中的工作表单元格,因此可能不会被调用。
  • @PaulOgilvie 该文档的意思是“除非将函数放在单元格中,否则此方法无效。”如果您创建一个函数并且只在代码中使用它,而不是将它放在任何单元格中,Volatile 将不起作用。另外,no VBA function is allowed to change any cells.
  • @CSerg,嗯? “此外,不允许任何 VBA 函数更改任何单元格”。 AcriveSheet.Cells("A1")= 123?
  • @PaulOgilvie 是的,如果从单元格调用的函数中执行,这将不起作用。

标签: vba excel


【解决方案1】:

它现在可以工作了!编译 VBA 代码后,Teste 函数现在每次我在工作表的任何单元格中进行更改时都会运行。此信息在@Paul Ogilvie (stackoverflow.com/questions/29915312/…) 分享的帖子中。

感谢大家的及时帮助!

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2021-01-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2021-03-20
    相关资源
    最近更新 更多