Excel 2003,Windows XP SP3:
我们有许多 Excel 用户使用非常大、复杂的 Excel 工作簿。一个典型的工作簿可能有 60 多个工作表,大小超过 70MB。我们有一个 .xll 插件,我们制作并在这些电子表格中使用。我们的插件具有广泛的调试和日志记录功能。
我们注意到一些非常奇怪和不稳定的行为,我们无法始终如一地重现这些行为。我在这里描述了这个问题的一个典型表现。
一个电子表格的范围之一有一个公式数组,其中涉及对函数的嵌套调用,包括 Excel ss 函数和我们自己的插件函数。公式可能类似于:
{=IF(cndtn,AddinFcn1(rng,INDIRECT(VLOOKUP($A2549,rng2,col,0)),AddinFcn2(param)),-1)}
其中 AddinFcn1 和 AddinFcn2 是我们插件中的注册函数。我们可以监控 Excel 调用每个插件函数的次数,并将所有调用匹配到导致调用的单元格或范围评估。如果我们在干净的 Excel 中加载插件和工作簿,然后计算工作簿(“F9”),计算可能会完成第一次、第二次甚至 10 次,我们可以看到对 AddinFcn2 和 AddinFcn1 的单个调用源于对包含上述公式的范围的评估。但有些次,事情开始变得疯狂:在第三个“F9”,内部 AddinFcn2 可能突然被 excel 调用 19 次,然后在第四个“F9”,内部 AddinFcn2 被调用 20,000 次。或者也许一切都很好,直到第 10 个“F9”在评估范围期间突然内部 AddinFcn2 被调用 19,000 次。奇怪的是,外部函数 AddinFcn1 仍然只被调用一次。
这种情况发生的时间或函数被调用的次数似乎没有韵律或理由。进入调用的数据,实际上是电子表格中各处的数据,每次 F9 都是相同的 - 从一个计算到下一个计算没有任何变化。
有没有人见过类似的行为?有没有人猜测是什么可能导致 Excel(不必要地)重新计算内部函数调用数十甚至数十万次?