我有一张相当大的 Excel 表格,用于记录我们的高尔夫比赛。为了加快表格的速度(用于我的旧笔记本电脑),我试图限制自动计算的次数。例如,只有当您进入最后一个洞时才会计算总分。
但是,我的即时窗口显示每次输入后都会进行大量计算。似乎某处有一个易失性函数。我已经搜索并替换了所有已知易失性的函数(我以前使用 INDIRECT 和 OFFSET)。我已经检查了所有命名范围的 OFFSET(并将其删除)。我甚至替换了所有 ROW 和 COLUMN 函数,尽管 MS 声称它们不是易失性的。
Excel 仍然在每次输入之后重新计算整个工作表,我似乎找不到来源。
我在 Windows 7 下使用 Excel 2016(荷兰语版本)。我使用几个 UDF(它们会给我有关正在进行的计算的反馈)进行简单计算。UDF 的所有数据都作为参数传递。
有没有什么方法可以追踪工作表中易失性计算的来源?
我的表格可以在http://www.wacgolf.nl/docs/WAC%202016.xlsm 直到“25-6”表为止,它都填满了测试分数。在该表中输入任何分数后,整个工作表都会重新计算。
我已经隔离了 calcChain.xml 文件,该文件应该包含计算链。但我看不出问题出在哪里。任何帮助都非常感谢。
答案1
经过一番搜索,我得出结论,我的 UDF 不是可变的。结果发现它是以下形式的引用:
INDEX([named range],[row],[col])
如果我将该引用替换为直接引用 ([sheet]![col][row]),计算将停止。我不知道它是 INDEX 函数还是命名范围或两者的组合。我使用了很多命名范围和很多对命名范围的 INDEX 引用。我无法将它们全部替换以找出问题所在。顺便说一句,命名范围是固定范围。我的工作表中没有使用 Offset()。
答案2
我现在认为这可能是错误的,请参阅下面的评论。除非特别标记为易失性,否则 UDF 显然被视为非易失性的。
扩展我的评论,你对易失性函数的看法完全正确。但这些易失性函数是你自己的用户自定义函数 - Excel 无法知道它们是否易失性,因此必须将它们视为易失性函数,每次对工作簿进行任何更改时都要重新计算它们。而且由于 VBA 相对于工作表函数来说速度较慢,这会真正减慢你的计算速度。
如果可能的话,尝试用工作表函数替换 UDF。您将看到性能的巨大提升。