我注意到每当我删除单元格时我的 UDF 都会重新计算。这会在删除整个列时导致大量延迟,因为 UDF 会为使用它的每个单元格调用。因此,如果您使用 1000 个 UDFS,则删除列或单元格将调用它 1000 次。
例如,将以下 UDF 放入模块中,然后使用 =HelloWorld() 从工作表中多次调用它
Function HelloWorld()
HelloWorld = "HelloWorld"
Debug.Print Now()
End Function
然后删除一行。如果您的经历和我一样,您会看到每次使用实例都会调用一次。
有人知道这种行为是否可以停止吗?我也很感兴趣为什么应该调用它。对我来说,这似乎是 Excel 依赖关系树中的一个缺陷,但很可能有一个很好的理由。
编辑:经过实验,我发现了更多触发 UDFS 的操作:
- Any change to the number of columns that a ListObject (i.e. Excel Table) spans through resizing (but not rows). Even if the UDFs themselves aren't in the ListObject concerned, or in fact in any ListObject at all.
- 在工作表中的任意位置添加新单元格或列(但不是行)。
请注意,手动计算模式在很多方面都不是一个选项。
首先,鉴于它是应用程序级设置,因此存在很大的风险,即有人会使用他们碰巧打开的任何一个电子表格的输出,而没有意识到自己处于手动计算模式。
其次,我实际上并不是在设计特定的电子表格,而是在写一本关于非开发人员如何利用编写良好的现成代码(例如 UDF)来完成他们无法完成的事情的书。示例包括动态连接或分割文本,或 Charles Williams 概述的精确匹配二分搜索 UDFhttps://fastexcel.wordpress.com/2011/07/22/developing-faster-lookups-part-2-how-to-build-a-faster-vba-lookup/(是的,我向他们发出了很多警告,通常基于本机公式的解决方案将优于 UDF。但是正如您从我上面引用的线程中看到的那样,精心编写的函数可以表现良好)。
我不知道用户将如何使用这些。
在缺乏编程解决方案的情况下,看来我只需在书中指出,如果用户使用资源密集型 UDFS,则在添加或删除单元格或调整 ListObject 大小时可能会遇到严重延迟。即使这些 UDF 编写得非常高效。
在自动模式下插入或删除行、列或单元格将始终触发重新计算。 (您可以通过将 =NOW() 添加到空工作簿并插入或删除内容来检查这一点)
问题应该是什么(意外)情况将单元格标记为脏,以便重新计算。
有一个(可能不完整的)此类内容的列表:http://www.decisionmodels.com/calcsecretsi.htm
看起来我需要添加一些关于 VBA UDF 的内容(尚未测试 XLL UDF)
- 它们的行为可能有所不同,因为它们的注册方式与 VBA UDF 不同)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)