当xlCoerce返回一个值时,它是否会再次评估单元格中的公式?

时间:2012-11-15 13:46:30

标签: excel user-defined-functions excel-interop excel-dna

当我使用ExcelDna在C#中制作一个简单的UDF时,我遇到了一个问题

该功能使用:

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

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

我不知道它会如何连接到循环错误。但我猜ExcelReference.GetValue()有时会评估细胞,有时候不会?

似乎第2类只影响xlfCaller

后来我检查了ExcelReference的源代码,结果发现它实际上是被调用的xlCoerce。

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

有人可以进一步详细说明我吗? xlCoerce如何处理Cell值/公式以及类2如何影响它?

1 个答案:

答案 0 :(得分:1)

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

如果您的函数已注册为宏表等效函数(通过在Excel-DNA的声明中添加IsMacroType=true),那么它将能够在计算时读取工作表上的任何值,包括之前的呼叫小区的值。在使用F2编辑公式的情况下,它不仅仅是重新计算,而是整个单元格内容的重新输入,因此与强制重新计算相比,这种行为有所不同。

它可能无法直接回答您的问题,但Charles Williams在此处对Excel计算流程进行了很好的描述:http://www.decisionmodels.com/calcsecretsc.htm