应用排序时 Excel UDF 是否会更新

应用排序时 Excel UDF 是否会更新

正如问题所暗示的,当我对电子表格进行排序时,我看到了我创建的 UDF 的副作用(速度慢)。我在 .NET 中创建了一些 UDF 并已部署进行测试。该函数在后台进行 API 调用,然后将数据返回到单元格。因此,当我创建函数并最初运行时,我预计会有一些延迟。当我对列进行排序时,我发现应用程序运行缓慢,就好像 UDF 正在重新计算并调用 API 一样。这是电子表格的正常行为吗?

我的函数确实有单元格引用,如下所示:

=wsStateMiles("ALKCUR",G45,K45,1,J45,$G$2)

在此处输入图片描述

当我删除该功能时,电子表格排序非常快,因为我尝试推断的第一件事是 Microsoft Excel 的实际速度很慢。

(附加信息)

这与排序无关,但当我添加额外的 UDF 时,Excel 运行速度似乎太慢,以至于需要重新计算整个电子表格的 UDF。同样,这是 Excel 的正常行为吗?

答案1

不幸的是,对于排序来说,这是预期的行为。

当您对表格进行排序时,Excel 会弄脏表格中的所有单元格。任何带有引用表格中单元格的参数的 UDF 都将被重新计算。

对于添加其他 UDF 的情况,我不确定为什么它会重新计算所有 UDF。普通的非易失性 VBA UDF 只会导致计算其输入的单元格。也许您的 .NET UDF 始终是易失性的,或者有一个设置/属性设置为“易失性”?我知道托管代码 UDF具有打开/关闭波动性的属性。


幸运的是,还是有一些好消息的。尽管不可能真正停止UDF 重新计算,这样可以加快其速度。

它需要 UDF 中的一个静态数组来存储所有返回值的当前状态(即L:L示例中的“Miles”列),以及一个用作 UDF 参数的“Suspend”单元格。排序之前,将 Suspend 单元格设置为TRUE,然后将其恢复为FALSE

暂停时,UDF 将从存储的值中返回与其调用者单元格相对应的结果。重新启动时,它将正常运行,但也会更新存储的值。

实现此功能的诀窍是实现滞后。每个单元对 UDF 的第一次调用重新启动,也必须返回存储的值。


或者,不使用“暂停”单元,而是将所有传递的参数也存储在静态数组中,这样 UDF 就可以始终返回存储的值,除非参数发生变化。一旦参数发生变化,就会调用 API 并存储结果,然后再返回。

第二种技术也会在添加其他 UDF 时自动加快重新计算速度。(第一种技术也可以在添加 UDF 时使用,方法是在添加 UDF 之前“暂停”,然后“恢复”。)

相关内容