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

这也许是一个高级的话题。

当您按F9或重新计算表单时,Excel首先尝试找出哪些单元格可能有机会被更改,因此可以跳过评估它们。 该algorithmsearch所有的祖先和祖先的祖先,以了解它们中的任何一个的值是否已经改变。 如果是这样,就进行实际评估。

至less,只要path中没有“INDIRECT()”公式即可。 如果存在,则algorithm假定此公式的值是不稳定的(即,它总是变化),并评估所有后代。

有更多的易变公式:兰德,地区,细胞,列,索引,间接,现在,偏移,行,今天。 其中一些显然应该是挥发性的(如RAND() )。

问题是否有任何告诉Excel的方法,除非其祖先改变,否则被Excel处理的给定单元实际上应该保持冻结状态?


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

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

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

用户定义的公式将不会帮助,因为它们可以做的内部的限制。

推荐以前的评论build议将计算移动到一个模式类似于…
1.将所有工作表数据拖入二维数组中。
2.对数据执行X转换。
3.将数据推回到一个等尺寸的工作表地址,到二维数组。

答案是不。 幸运的是,通常总是使用易失性函数(包括CHOOSE,INDEX)的非易失性替代方法,在date/时间函数中,可以使用易失性NOW和TODAY函数来提供下拉列表。

对于我之前编写的链接很长的文章,请参阅https://chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/以及更多有关使用为避免波动,请参阅http://dailydoseofexcel.com/archives/2014/02/23/data-validation-doesnt-care-about-volatility/上的其他文章