在Excel中使用volatile公式(如INDIRECT())时,如何优化脏单元格优化?

在Excel中使用volatile公式(如INDIRECT())时,如何优化脏单元格优化?,excel,excel-formula,Excel,Excel Formula,这可能是一个比较高级的话题 当您按F9键或重新计算工作表时,Excel会首先尝试找出哪些单元格可能会被更改,因此它可以完全跳过对这些单元格的计算。该算法搜索所有祖先和祖先的祖先,以确定其中任何一个的值是否发生了变化。如果是,则进行实际评估 至少,只要路径中没有“INDIRECT()”公式,就可以这样做。如果存在,则算法假定此公式的值是可变的(即它总是变化),因此会计算所有子代 还有一些更不稳定的公式:RAND、area、CELL、COLUMNS、INDEX、INDIRECT、NOW、OFFSET

这可能是一个比较高级的话题

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

至少,只要路径中没有“INDIRECT()”公式,就可以这样做。如果存在,则算法假定此公式的值是可变的(即它总是变化),因此会计算所有子代

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

问题是:有没有办法告诉Excel,一个被Excel处理为不稳定的给定单元格实际上应该保持为冻结状态,除非其祖先发生变化


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


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

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

用户定义的公式也不会有帮助,因为您可以在其中执行的操作有局限性

正如前面的评论所建议的,建议将计算移动到类似于…
1.将所有图纸数据拉入二维数组。
2.对数据执行X转换。

3.将数据推回到一个大小相等的工作表地址中,放到2D数组中。

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