当我使用 ExcelDna 在 C# 中创建简单的 UDF 时遇到了一个问题
该函数使用以下内容:
var reference = XlCall.Excel(XlCall.xlfCaller);
string oldValue = ((ExcelReference)reference).GetValue().ToString();
除非我指定了IsMacroType=true
,否则会导致循环引用错误(GetValue
尝试通过再次调用 UDF 来重新计算单元格),这将函数标记为类 2(#
添加到公式中)。
我不知道它将如何连接到循环错误。但我想ExcelReference.GetValue()
有时会评估细胞,有时不会?
似乎2类只影响xlfCaller
,
后来我检查了ExcelReference
的源代码,原来实际上是xlCoerce被调用。
另外,我注意到当我在单元格上按 F2 时,无论单元格是什么,GetValue()
都会返回 0。当我按 Ctrl+Alt+F9 强制重新计算所有时,GetValue()
返回之前的计算值。
有人可以进一步详细说明我吗?xlCoerce 如何在单元格值/公式上工作,第 2 类如何影响它?
xlCoerce
只是获取引用中包含的值的标准方法。就其本身而言,使用 ExcelReference 进行此调用不应导致单元格重新计算。
如果您的函数注册为宏表等效函数(通过在 Excel-DNA 的声明中添加IsMacroType=true
),那么它将能够在计算时读取工作表上的任何值,包括调用单元格的先前值。在使用 F2 编辑公式的情况下,这不仅仅是重新计算,而是单元格内容的整个重新输入,因此与强制重新计算相比,这行为是有道理的。
它可能不会直接回答你的问题,但查尔斯威廉姆斯在这里对Excel计算过程有很好的描述:http://www.decisionmodels.com/calcsecretsc.htm。