为什么Excel调用UDF的次数超过了要求?

我有一个使用了很多UDF的电子表格。 最后一次运行时,执行时间比以前大得多,但数据量现在更大。 我决定统计每个UDF的电话,看是否有不寻常的事情发生。

我很惊讶地发现无条件使用的UDF被称为工作表中UDF公式的2倍。 请注意,这发生在我请求重新计算工作表时。

但是,如果我计算UDF方程的一个子集(例如一列),则所计算的计算次数与UDF用法的数量完全相同 – 就像您期望的一样。

任何想法当重新计算整张纸时会发生什么? 有没有办法在重新计算整个工作表时强制对UDF进行单一评估?

这通常发生是因为Excel不知道将UDF放在计算树上的哪个位置。 它进行猜测并监视进度。 在你的情况下,它是猜错了,并重新插入到树(x2)。

Excel无法弄清楚如何处理UDF最常见的原因是你没有提供所有必要的参数。 如果您将所有内容都作为parameter passing给UDF,则Excel只能告诉在UDF之前需要计算的内容。

Public Function AddToA1(rAddTo As Range, rA1 As Range) As Double AddToA1 = rAddTo.Value + rA1.Value End Function 

当Excel正在构build计算树时,它会 rAddTo和rA1 之后放置任何具有此函数的单元格。 当它计算这个函数时,它看到rAddTo和rA1不是脏的(已经计算过),所以它计算一次,永不回头。

 Public Function AddToA1(rAddTo As Range) As Double AddToA1 = rAddTo.Value + ActiveSheet.Range("A1").Value End Function 

在这个函数中,你正在使用一个没有通过parameter passing给函数的值。 Excel将这个函数放在rAddTo之后,但不知道它应该放在A1之后。 当计算这个函数时,rAddTo被正确计算。 但是如果A1因为在树的下方居住而不能正确计算,那么Excel将在A1之后重新插入这个函数,在那里它将被再次计算。

我不知道计算引擎的所有内部工作原理,但根据我的经验,如果在函数的参数中包含所需的每个值,它将只计算一次。