excel - 为什么 Excel 调用的 UDF 次数超出了要求?

标签 excel vba

我有一个使用大量 UDF 的电子表格。上次运行时,执行时间比上次长很多,但数据量现在更大了。我决定对每个 UDF 的调用进行计数,看看是否发生了异常情况。

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

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

知道重新计算整个工作表时会发生什么吗?重新计算整个工作表时是否强制对 UDF 进行单一计算?

最佳答案

发生这种情况通常是因为 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 之后重新插入此函数,并再次计算它。

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

关于excel - 为什么 Excel 调用的 UDF 次数超出了要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26475414/

相关文章:

html - 使用宏将数据从网站抓取到 Excel...丢失

arrays - 为什么从 VBA 写入文件的字节会为每个字节添加 1100?

vba - 从函数设置单元格值

VBA - 错误 1004 - 方法类的 CopyPicture 失败

Excel-VBA : How to get size of selected array in vba code?

java - 如何使用 Apache poi 库保护 XSSFWorkbook 中的工作表?

vba - 按名称查找列标题并选择列标题下方的所有数据 (Excel-VBA)

vba - Excel 在运行时另存为

R Shiny 的 csv 或 excel 上传选项

javascript - Google 脚本或 VBA - 输入输入值时插入行 (Excel)