【问题标题】:How to optimize dirty cell optimization when using volatile formula in Excel (like INDIRECT() )?在 Excel 中使用 volatile 公式(如 INDIRECT() )时如何优化脏单元格优化?
【发布时间】:2013-06-07 02:43:23
【问题描述】:

这可能是一个有点高级的话题。

当您按 F9 或重新计算工作表时,Excel 会首先尝试找出可能会更改的单元格,因此它可以完全跳过评估它们。该算法搜索所有祖先和祖先的祖先以找出其中任何一个的值是否已更改。如果是,则进行实际评估。

至少,只要路径中没有“INDIRECT()”公式就可以了。如果有,算法假定这个公式的值是易变的(即它总是变化的),因此评估所有的后代。

还有更多易变的公式:RAND、AREAS、CELL、COLUMNS、INDEX、INDIRECT、NOW、OFFSET、ROWS、TODAY。其中一些显然应该是易变的(例如RAND())。

问题:有没有办法告诉 Excel,Excel 处理为 volatile 的给定单元格实际上应该保持冻结状态,除非它的祖先发生变化?


解决问题的一种方法是在 VBA 中编写我自己版本的 Excel volatile 函数。假定 VBA 函数不是易失性的。

问题在于 VBA 调用的成本相对较高。另一个是“重新发明轮子”的需要。我希望有更便宜的解决方案。

【问题讨论】:

  • 不准确,因为它的祖先不是直接引用并且 excel 不会跟踪它们
  • 当我遇到大型 Excel 公式评估性能问题时,我通常会将成本最密集的公式移到等效的 VBA 脚本中,该脚本会重新生成工作表的相关部分。然后我通常让用户单击某种“更新表”按钮。然后脚本将计算值直接写入工作表中。只需执行一次重新计算即可显着提高性能。
  • @JosieP 但 Excel 应该知道,当引用是例如无效,公式为非易失性。即使没有,只要参数和它指向的单元格都没有改变(如<B1>=INDIRECT("A1") 是一个常数),结果就不可能改变,所以公式不会需要再次不稳定。
  • 我想知道,OO 的 Calc 是如何处理这个问题的。 AFAIK 它共享 volatile-formula 概念。但它是否比 Excel 进一步优化了问题?
  • 这是我的观点-excel 不会跟踪 INDIRECT 指向的单元格-它只是将公式标记为易失性并且您无法更改它(除了避免易失性函数)

标签: excel excel-formula


【解决方案1】:

不是你想要的答案,但是... 不要使用公式。

用户定义的公式也无济于事,因为您可以在其中执行的操作受到限制。

推荐之前的评论建议将计算移动到类似于...的模式中...
1. 将所有工作表数据拉入二维数组。
2.对数据进行X变换。
3. 将数据推回相同大小的工作表地址,到二维数组。

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 2023-01-18
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多