如何在背景中获取某些单元格的值?

时间:2016-08-17 03:32:16

标签: c# .net excel excel-dna

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

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你可能从UDF中调用它。普通UDF无法读取工作表的其他部分 - 我们的想法是将您需要的信息作为参数传递给函数。

您可以将Excel-DNA功能标记为'宏表功能',这将使其正常工作。 (在ExcelFunction属性中设置IsMacroType = true。)但是这会对您的计算序列产生其他副作用,例如,您可能会从计算开始之前获取该单元格中的值。

因此,最好坚持使用Excel的功能样式,并将额外的依赖项传递给UDF。

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

Excel基本上是单线程的,所以当使用COM对象模型时也是如此 - 所有调用在实际运行之前由COM编组到主Excel线程。

在Excel-DNA加载项中,您可以使用ExcelAsyncUtil.QueueAsMacro(...)帮助程序将代码安排在主线程上作为宏运行。您传入的代理将尽快运行,并且可以安全地进行您询问的C API调用。