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



我使用的是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代码中)它们是在调用向导的不同"线程"中完成的。这样就不会再结冰了(这样就可以保留向导中方便的部分。)显然,如果我正确理解这篇msdn文章(也许不是,以防不是同一个问题),这在Excel2007下是不可能的,但在excel>=2010中是可能的。

由于F的用户正在使用各种版本的excel——主要是2007年,但其中一些用户甚至是2003年——即使我很想把时间推到2010年(拜托,现实生活中我们毕竟已经到了2013年了!),我也不会这么做,因为上面提到的原因,但也因为只为某些excel版本工作对我来说并不令人满意。。。

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

这就是为什么任何见解都是受欢迎的!提前很多。(很抱歉问题太长。)

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

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

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

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