2

使用 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 如何处理单元格值/公式以及第 2 类将如何影响它?

4

1 回答 1

2

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

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

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

于 2012-11-16T12:06:14.857 回答