2

假设我有一个将在工作表中使用 100,000 多次的 UDF。在函数中,有没有办法让它知道在批处理中还要调用多少次?基本上我想做的是让每个函数都创建一个待办事项列表。我想做类似的事情:

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

有没有办法做到这一点?

背景:

我想制作一个 UDF,用户只需提供参数(日期、小时、节点、类型)即可执行 SQL 查询。如果您愿意在每次运行函数时实际执行 SQL 查询,这很容易做到。我知道这很容易,因为我这样做了而且速度非常慢。我的新想法是让函数首先查看它要查找的数据是否存在于全局缓存变量中,如果不将其添加到全局变量“job-list”中。

我想要它做的是当调用最后一个函数时,然后遍历作业列表并执行最少数量的 SQL 查询并填充全局缓存变量。一旦缓存变量已满,它将执行表刷新以使所有其他函数再次被调用,因为在随后的调用中,它们将在缓存中找到所需的数据。

4

2 回答 2

2

首先:
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 事件和缓存 http://fastexcel.wordpress.com/2012/12/05/writing-efficient-udfs-part-12-getting-used-range-fast-using -application-events-and-a-cache/
基本上,您需要的方法是让 UDF 检查缓存,如果不是当前的或可用的,则将请求添加到队列中。
然后使用计算后事件处理队列,并在必要时触发另一个重新计算。

于 2013-02-10T17:55:21.983 回答
0

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

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

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

这种方法可能不适用于您的问题。不过,总的来说,在数据库中运行的基于集合的方法会表现得更好。

至于缓存机制,如果你必须走那条路。我可以想象一个具有以下伪代码的函数:

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

这个逻辑可以进入函数。不过,正如@Bulat 建议的那样,最好在函数周围添加一个额外的缓存层。

于 2013-02-10T17:32:52.910 回答