0

我正在使用excel c/c++ sdk >= 2007(我把 2007 的链接作为参考)和 excel >= 2007。我(使用 sdk)编码了一个 xll,它提供了一个函数 F,这个函数 F 可以在excel表格中以两种方式调用:1)在excel单元格/单元格区域或公式栏中直接写入涉及F的公式2)在excel单元格中写入=F,然后单击公式左侧的fx图标栏并使用excel的功能向导

只有第二种情况让我感兴趣。在这种情况下,这将打开 excel 函数向导的对话框:一个具有 n 个单元格的窗口,每个单元格对应于 F 的一个参数(假设 F 是一个采用 n 个参数的函数)。现在,默认情况下,您是否在其中一个单元格中输入了一些内容,excel 会触发函数的重新计算。

当您不知道该函数并想要“发现它”时,这特别方便,因为您可以查看您键入的内容是否代表 F 等的正确参数,例如确实出现错误等。

但是如果 F 依赖于一个非常密集的数值例程(在 c++ 中),那么所有的重新计算都会花费很长时间,并且会冻结向导。(因为每次修改对话框中的单元格,都会触发重新计算。)

因此,我想做以下事情:通过函数向导“调用”函数时以某种方式停用重新计算。这就是低质量的解决方案。

理想情况下,我想做以下事情:自动触发重新计算,但确保(在 c++ excel sdk 代码中)它们是在调用向导的不同“线程”中完成的。这样就不会再结冰了。(以便可以保留向导的方便部分。)显然,如果我正确理解这篇 msdn 文章(也许不是,以防它不是同一个问题)在 excel 2007 下是不可能的,但它在 excel >= 2010 年。

由于 F 的用户正在使用各种版本的 excel - 主要是 2007 年,但其中一些甚至是 2003 年 - 即使我很想推到 2010 年(来吧,我们毕竟在现实生活中已经到了 2013 年! ),出于上述原因,我不会这样做,但也因为仅对某些 excel 版本有效的东西对我来说并不令人满意...

所以我想找到另一个解决方案。我听到人们为此谈论 RTD,但我不确定。

这就是为什么欢迎任何见解!提前很多。(对于问题的长度感到抱歉。)

4

2 回答 2

0

请参阅这篇MSDN 文章,其中讨论了要使用的方法,以及 C++ 示例
这是 XLDNA 和 XLL Plus 等框架使用的方法(我认为也是 Addin Express)。

我不认为使用异步 UDF 签名会有所帮助,因为函数向导在幕后使用 Evaluate 方法而不是实际的重新计算(但我实际上没有尝试过)

于 2014-11-10T08:30:53.757 回答
0

一种解决方法是在路由开始时检查参数是否丢失为零,并且仅计算是否设置了所有参数。我知道每次用户打开对话框并更改一些值时它不会阻止重新计算,但至少它会阻止重新计算,直到用户设置所有参数。

您可以添加一个附加参数(例如触发器)并在计算之前检查该参数是否设置为某个值(例如 1)。

于 2016-07-04T21:27:33.697 回答