2

我目前有一个使用表单的宏,以便在外部程序的帮助下执行一些计算。它所做的只是将一些工作表值写入文件以供另一个程序(外部 .exe)使用作为输入(该程序是封闭源代码)。所述程序然后编写自定义格式输出,我用 VBA 将其废弃,然后将返回值传递回工作表。通过指定源和目标范围的用户表单调用宏。

我想要做的是用 UDF 替换通过用户窗体调用计算的方法。使用GUI方式,更新计算比较麻烦;也不可能知道在目标范围数据中执行了哪些计算。出于性能考虑,选择此路径而不是 UDF。由于计算速度很慢,我不能只重用调用外部程序作为 UDF 的用户表单代码部分并完成它,因为它太慢了。VBA 中似乎没有异步执行(与 Excel 2010 中的 xll 不同)。

一个可能的解决方案是在 UDF 开始执行时立即退出它,除非将全局设置为 true。除非从特定的功能区按钮调用重新计算,否则该全局总是错误的。问题是它不断地执行 UDF,一直将这些范围发送到 #N/A 值,所以我无法引用这些范围。另一种方法是创建假公式,即在指定参数和目标范围的单元格上添加注释。这也有很多问题。

所以。关于如何实现假异步计算 UDF 的任何想法?

谢谢!

4

1 回答 1

2

If I understand you correctly you want to have a VBA UDF that returns the value from the previous calculation if the global is false, otherwise do the full slow calculation.
There are several different possible approaches to this, which all have different drawbacks:

  • use application.caller.value. This will cause a circular reference and require you to switch on iterative calculation
  • use application.caller.text. This is simple and works without iterative calculation but gets the formatted value so you need to be sure that your UDF does not lose precision etc
  • at udf exit store the value in a global array indexed by the full calling cell address and at udf entry retrieve it. This will not persist in a saved workbook unless you store the global array somewhere at save/close and retrieve on open.
  • Write an XLL or XLM macro-equivalent UDF that retrieves the previous value
于 2012-01-06T09:10:54.420 回答