为什么Excel调用UDF超过要求?

时间:2014-10-20 21:41:23

标签: excel excel-vba vba

我有一个使用大量UDF的电子表格。我最后一次运行它时,执行时间远远大于上一次,但数据量现在更大了。我决定计算每个UDF的调用,以查看是否有异常情况发生。

我惊讶地发现无条件使用的UDF被称为工作表中使用UDF方程的次数的2倍。请注意,当我请求重新计算工作表时会发生这种情况。

但是,如果我计算UDF方程的一个子集(例如一列),计算的计算次数与UDF使用次数完全相同 - 正如您所期望的那样。

知道重新计算整张纸时发生了什么事吗?无论如何在重新计算整个工作表时强制单次评估UDF?

1 个答案:

答案 0 :(得分:4)

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

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

Public Function AddToA1(rAddTo As Range, rA1 As Range) As Double

    AddToA1 = rAddTo.Value + rA1.Value

End Function

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

Public Function AddToA1(rAddTo As Range) As Double

    AddToA1 = rAddTo.Value + ActiveSheet.Range("A1").Value

End Function

在此函数中,您使用的是未通过其参数传递给函数的值。 Excel将此函数放在rAddTo之后,但它不知道它应该放在A1之后。当计算此函数时,正确计算rAddTo。但是如果A1没有正确计算,因为它位于树的下方,那么Excel会在A1之后重新插入此函数,然后再次计算它。

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