【问题标题】:Excel - Function dependency causing no calculationExcel - 函数依赖性导致不计算
【发布时间】:2017-06-01 15:42:21
【问题描述】:

我遇到了一个问题,即公式没有更新(我特意进行了手动计算)。特别是,它们是具有一些复杂依赖关系的公式。

Cell1:  "=Cell2"
Cell2:  "IFERROR(FindData(X1, X2))"

FindData 是我编写的 VBA 函数,它在预定义的范围 (RangeXYZ) 上使用 Index(Match(X1),Match(X2))

该范围具有许多连接到外部数据服务的公式(不是 excel 数据连接,只是另一个自定义 vba 公式)。

当我计算 Cell1 时,Excel 不会计算任何下游的东西。我需要一种方法让它强制计算 RangeXYZ,然后重新计算 Cell2,然后重新计算 Cell1。

谢谢

编辑:我已经有了,工作表 Cell1 包含在:

Private Sub Worksheet_Calculate()
    Application.calculatefull
End Sub

但我发现这以无限循环的计算结束。我也尝试过指定工作表 Sheets("Sheet1").Calculate,但这似乎不起作用。

确实有效的 Ctrl-Alt-F9 有点矫枉过正并且需要太多时间。

【问题讨论】:

  • 也许尝试把Application.Volatile = True作为FindData的第一行?
  • 只需Application.Volatile,不需要。
  • 但请注意,Application.Volatile 会在每次重新计算工作表时重新计算,而不仅仅是在输入范围更改时。这可能适用于您的情况,因为您有手动计算,但 Application.Volatile 到目前为止还不是万灵药,只能谨慎使用。
  • @keynesiancross : Enable iterative calculation 我的错,见support.office.com/en-us/article/…
  • 理想情况下,您应该将查找范围作为参数传递给 UDF。那么它就不需要是易变的。

标签: vba excel


【解决方案1】:

我强烈建议将 RangeXYX 作为第三个参数传递。 Excel 计算引擎会探测工作簿测试依赖项,您需要帮助它,而不是用虚假优化来欺骗它。

如果您真的想威胁 Excel 计算引擎进行竞价,那么您可以在事件处理程序中尝试此操作

Option Explicit

Private Sub Worksheet_Calculate()
    Me.Range("RangeXYZ").Calculate
End Sub

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 2015-04-17
    • 1970-01-01
    • 2010-10-18
    • 2020-05-17
    • 2014-07-26
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多