当 xlCoerce 返回一个值时,它会再次计算单元格中的公式吗?

Posted

技术标签:

【中文标题】当 xlCoerce 返回一个值时,它会再次计算单元格中的公式吗?【英文标题】:When xlCoerce returns a value, does it evaluate the formula in a cell again? 【发布时间】:2012-11-15 13:46:29 【问题描述】:

我在 C# 中使用 ExcelDna 制作简单的 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 类对其有何影响?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于当 xlCoerce 返回一个值时,它会再次计算单元格中的公式吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 Ionic4 Modal [object Object] 返回数据

wpf点击checkbox触发了两次

编辑值时输入失去焦点。使用 ngFor 和 ngModel。角5

数组中的字符串仅在尝试获取单个值时返回未定义?

在AngularJS中删除输入值时如何再次验证表单

C# 将 20 位精度双精度转换为字符串并再次返回