我正在尝试创建ExcelReference,然后调用GetValue(),但这会导致XlCallException(异常中没有提供详细信息)。
var val = new ExcelReference(1, 1).GetValue();
我做错了什么?
答案 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调用。