【发布时间】:2019-03-14 11:18:54
【问题描述】:
问题
是否可以有效地从 VBA 模拟 application.calculate 的结果,但忽略 volatile 函数?
详情
定义:非易失性等效项:对于任何易失性工作簿,将非易失性等效项定义为所有具有易失性引用的单元格都已被其原始值替换的工作簿。
定义:非易失性计算差异:假设我们有任何工作簿。现在假设我们采用它的非易失性等价物并对其进行了全面重新计算。取值在非易失性等效项中发生变化的单元格及其值。这些是非易失性计算差异。
问题是这样问的。对于任何包含潜在易失性引用的工作簿,有没有办法有效地应用非易失性差异?效率是这里的关键——这是我们希望忽略 volatile 函数的全部原因——请参见下面的用例。因此,任何不优于完全重新计算的解决方案都是无用的。
用例
我们的工作簿中充斥着INDIRECT 的用法。 INDIRECT 是 Excel 原生的 volatile 函数。工作簿中大约有 300,000 个,其中总共包含大约 150 万个已使用的单元格。我们没有能力改变这些。由于这些INDIRECT 的使用,我们的工作簿需要很长时间才能重新计算。大约 10 秒。所以我们关闭了自动计算,用户会定期点击手动重新计算来刷新数据。
我们的业务用户对此表示满意,但我们正在添加的一些新 VBA 功能可能使用比 10 秒等待更有效的方法。
到目前为止我们所做的尝试
-
Sheet.Calculate- 这在某些情况下很方便。我们确实使用它。但它将所有其他工作表中的数据视为值,而不是公式。因此,如果有任何 zig-zag 引用,这并不能提供完全一致的结果。例如。想象一下来自工作表 A -> 工作表 B -> 工作表 A 的引用:然后需要计算工作表 A,然后是 B,然后是 A。之字形的数量是任意的。这只是一个案例,有两张纸。要解决这个问题,需要从根本上重写 Excel 的整个计算。
【问题讨论】:
标签: excel vba excel-formula volatile calculation