有没有一种方法让VBA UDF“知道”其他function将会运行?

假设我有一个UDF,将在工作表中使用100,000次以上。 在这个function里,有没有一种方法可以让它知道在批处理中会被多次调用? 基本上我想要做的是每个function都创build待办事项列表。 我想做一些事情:

IF remaining functions to be executed after this one = 0 then ... 

有没有办法做到这一点?

背景:

我想做一个UDF,将执行SQL查询用户只是给参数(date,小时,节点,types)。 如果你愿意在每次运行函数时真正执行SQL查询,那么这很容易实现。 我知道这很容易,因为我这样做,而且速度很慢。 我的新想法是首先让函数看看它正在查找的数据是否存在于全局cachingvariables中,以及是否不将它添加到全局variables“job-list”中。

我想要做的是当最后一个函数被调用,然后通过作业列表并执行最less数量的SQL查询并填充全局cachingvariables。 一旦cachingvariables已满,它将执行表刷新,以使所有其他函数再次被调用,因为在随后的调用中,他们将在caching中find所需的数据。

首先:
VBA UDF性能对UDF的编码方式非常敏感:请参阅我的一系列关于编写高效的VBA UDF的文章:

http://fastexcel.wordpress.com/2011/06/13/writing-efficient-vba-udfs-part-3-avoiding-the-vbe-refresh-bug/

http://fastexcel.wordpress.com/2011/05/25/writing-efficient-vba-udfs-part-1/

您还应该考虑使用数组UDF来返回多个结果:
http://fastexcel.wordpress.com/2011/06/20/writing-efiicient-vba-udfs-part5-udf-array-formulas-go-faster/

其次:
本系列的第12篇文章概述了使用AfterCalculate事件和cachinghttp://fastexcel.wordpress.com/2012/12/05/writing-efficient-udfs-part-12-getting-used-range-fast-using-应用程序事件,和一个caching/
基本上,您需要的方法是让UDF检查caching,如果不是最新的或可用的,则向队列添加请求。
然后使用计算后事件来处理队列,如果需要触发另一个重新计算。

从Excel电子表格执行100,000个SQL查询似乎是一个糟糕的devise。 在这些之上创build一个caching机制似乎使问题复杂化,使得它比可能需要更复杂。 在某些情况下,这可能是适当的,但我会考虑其他devise方法。

最明显的是从Excel电子表格中获取数据并将其加载到数据库中的表中。 然后使用数据库对所有行进行一次处理 。 最后一步是将结果读回Excel。

我发现从Excel中获取大量行到数据库中的最好方法是将Excel文件保存为csv并批量插入它们。

这种方法可能无法解决您的问题。 一般来说,数据库中运行的基于集合的方法将会performance得更好。

至于加速机制,如果你不得不走下去。 我可以想象一个具有以下伪代码的函数:

 Check if input values are in cache. If so, read values from cache. Else do complex processing. Load values in cache. 

这个逻辑可以在函数中进行。 正如@Bulat所说,尽pipe在函数中添加一个额外的caching层可能会更好。