当我使用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如何影响它?
答案 0 :(得分:1)
xlCoerce
只是获取引用中包含的值的标准方法。单独使用ExcelReference进行此调用不应该导致单元格重新计算。
如果您的函数已注册为宏表等效函数(通过在Excel-DNA的声明中添加IsMacroType=true
),那么它将能够在计算时读取工作表上的任何值,包括之前的呼叫小区的值。在使用F2编辑公式的情况下,它不仅仅是重新计算,而是整个单元格内容的重新输入,因此与强制重新计算相比,这种行为有所不同。
它可能无法直接回答您的问题,但Charles Williams在此处对Excel计算流程进行了很好的描述:http://www.decisionmodels.com/calcsecretsc.htm。