使用excel sdk用c ++编写的Excel函数:我希望它在excel的函数向导中使用时不会触发计算

时间:2014-11-03 15:31:25

标签: c++ multithreading excel xll

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

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

当你不知道这个函数并希望“发现它”时,这是特别方便的,因为你可以看到你输入的内容是否代表F等的正确参数,例如错误确实出现等。

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

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

理想情况下,我想执行以下操作:自动调整要触发的重新计算,但确保(在c ++ excel sdk代码中)它们是在与向导不同的“线程”中完成的叫做。这样就不会再冻结。(这样可以保留向导的方便部分。)显然,如果我正确理解this msdn article(也许不是,如果它不相同问题)在excel 2007下它是不可能的,但它在excel> = 2010。

由于F的用户正在使用各种版本的excel - 主要是2007年,但有些甚至是2003年的一些 - 即使我很想推动到2010年(来吧,我们毕竟已经到了2013年)现实生活!),我不会这样做,因为提到的原因,但也因为我不满足于只为某些excel版本工作......

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

这就是欢迎任何见解的原因!提前做了很多。 (对不起这个问题的长度。)

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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