当xlCoerce返回一个值时,它是否再次在单元格中计算公式?

当我在Excel中用C#编写一个简单的UDF时,我遇到了一个问题

该function使用这个:

var reference = XlCall.Excel(XlCall.xlfCaller); string oldValue = ((ExcelReference)reference).GetValue().ToString(); 

这将导致循环引用错误( GetValue尝试通过再次调用UDF来重新评估单元格),除非我指定了IsMacroType=true ,它将该函数标记为类2(将#添加到公式中)。

我不知道如何连接到循环错误。 但我猜ExcelReference.GetValue()有时会评估单元格,有时不是?

看来2类只影响xlfCaller

后来我检查了ExcelReference的源代码,事实certificate,它实际上是调用xlCoerce。

另外,我注意到当我在单元格上按F2时,无论单元格是什么, GetValue()返回0。 而当我按Ctrl + Alt + F9强制重新计算所有, GetValue()返回以前的计算值。

有人能再详细说一下吗? xlCoerce是如何在单元值/公式上工作的,第二类如何影响它?

xlCoerce只是获取引用中包含的值的标准方式。 本身,使用ExcelReference进行调用不应该导致单元格重新计算。

如果你的函数被注册为一个macros表等价函数(在你的Excel-DNA声明中joinIsMacroType=true ),那么它将能够在计算时读取表单中的任何值,包括调用单元格的前一个值。 在用F2编辑公式的情况下,这不仅仅是重新计算,而是整个单元格内容的重新input,因此与强制执行重新计算相比,这种行为是有意义的。

它可能不会直接回答你的问题,但查尔斯·威廉姆斯在这里的Excel计算过程有一个很好的写作: http : //www.decisionmodels.com/calcsecretsc.htm 。