如何在后台获取某些单元格的值?

How can I get values of certain cells in background?

我正在尝试创建 ExcelReference,然后调用 GetValue(),但这会导致 XlCallException(异常中未提供详细信息)。

var val = new ExcelReference(1, 1).GetValue();

我做错了什么?

您可能是从 UDF 内部调用它。普通 UDF 无法读取 sheet 的其他部分 - 这个想法是将您需要的信息作为参数传递给函数。

您可以将 Excel-DNA 函数标记为 'Macro-Sheet function',这将使它起作用。 (在 ExcelFunction 属性中设置 IsMacroType=true。)但这对您的计算序列有其他副作用,例如,您可能会从该单元格获取计算开始前的值。

所以最好坚持 Excel 的函数式风格,并将额外的依赖项传递到您的 UDF 中。


另一种可能性是您从后台工作线程调用它。 Excel C API(您通过 ExcelReference 类型使用)只能从主 Excel 线程调用(线程安全 UDF 有一些例外).所以你需要让你的后台代码在主线程上运行。

Excel 基本上是单线程的,所以在使用 COM 对象模型时也是如此 - 所有调用在实际 运行.

在 Excel-DNA 插件中,您可以通过使用 ExcelAsyncUtil.QueueAsMacro(...)帮手。您传入的委托将 运行 尽快,并且可以安全地进行您询问的那种 C API 调用。