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

时间:2013-06-11 09:35:47

标签: excel excel-formula

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

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

至少,只要路径中没有“INDIRECT()”公式,那就是这样。如果存在,则算法假定该公式的值是易变的(即它总是改变),因此评估所有后代。

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

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


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

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

2 个答案:

答案 0 :(得分:0)

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

由于您可以在其中执行的操作的限制,用户定义的公式无法提供帮助。

推荐之前的评论建议将计算转换为类似于...的模式  1.将所有表格数据拉入2D数组  2.对数据执行X变换  3.将数据推回到等大小的纸张地址,再推送到2D数组。

答案 1 :(得分:0)

答案是否定的。但幸运的是,通常总是使用易失性函数的非易失性替代方法,包括CHOOSE,INDEX,在日期/时间函数的情况下,您可以使用易失的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/的其他文章