c# - ExcelDNA 评估公式为自定义 UDF 返回 ExcelErrorName

标签 c# excel excel-formula excel-interop excel-dna

我正在使用 ExcelDNA 在 C# 中编写自定义 UDF,但这似乎是 Excel 和公式计算的普遍问题。

我唯一的问题是:我做错了什么(可能是 UDF 定义错误)还是 Excel 有问题?

谢谢你的帮助。

============================================= ==========================

UDF

假设我这样定义一个 UDF:

[ExcelFunction(IsMacroType = true, Name = "MyTest")]
public static string MyTest()
{
    return "MyTest";
}

工作

以下公式评估工作正常(结果“MyTest”):

var evaluation = XlCall.Excel(XlCall.xlfEvaluate, "MyTest()");

不工作

鉴于此评估不起作用(结果将为“ExcelErrorName”):

var evaluation = XlCall.Excel(XlCall.xlfEvaluate, "CONCAT(MyTest(); MyTest())");

我尝试了几件事,并认识到可以根据需要创建任意数量的 UDF,并将它们嵌套在彼此之中。但是,只要您将自己的 UDF 的任意两个(或更多)作为参数传递给任何其他函数,Excel 就无法计算公式。

我还尝试使用返回相应 COM 错误的 Excel 互操作方法:

var app = ExcelDnaUtil.Application as Application;
var result = app.Evaluate("CONCAT(MyTest(), MyTest())");

例子

工作

var evaluation = XlCall.Excel(XlCall.xlfEvaluate, "MyTest2(MyTest2(MyTest2()))");
var evaluation = XlCall.Excel(XlCall.xlfEvaluate, "MyTest3(MyTest(); CONCAT(\"A\";\"B\"))");

不工作

var evaluation = XlCall.Excel(XlCall.xlfEvaluate, "MyTest2(MyTest(); MyTest())");
var evaluation = XlCall.Excel(XlCall.xlfEvaluate, "MyTest2(MyTest(); MyTest3())");

最佳答案

Evaluate 有很多怪癖(请参阅我的博客文章 about Evaluate)
不确定您的 CONCAT 函数是什么,但此 VBA 代码在 XL 2016 中对我来说工作正常:

Option Explicit

Public Function MyTest()
MyTest = "MyTest"
End Function
Public Function MyTest2()
MyTest2 = "MyTest2"
End Function
Public Function MyTest3(var1, var2)
MyTest3 = var1 & var2
End Function
Sub evaltest()
Dim var As Variant
Dim var2 As Variant
var = Evaluate("MyTest3(MyTest(), MyTest2())")
var2 = Evaluate("CONCATENATE(MyTest(), MyTest2())")
End Sub

关于c# - ExcelDNA 评估公式为自定义 UDF 返回 ExcelErrorName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39610594/

相关文章:

c# - 我的 SQL 准备语句不起作用

随单元格值变化的字符串?

excel - 如何在 INDIRECT 函数中使用单元格引用

excel - 如何反转匹配函数的顺序,从顶部底部到事件单元顶部

c# - 如何使用 C# 在 Excel 中更改系列颜色?

excel - 删除Excel中时间的前导零

c# - Entity Framework : Update affecting Object

c# - 目标数组的长度不足以复制集合中的所有项目。检查数组索引和长度

c# - 如何将一个数组项属性值设置为对另一个项的引用的 C# 数组转换为 JSON

excel - 我可以只为包含计算数据的单元格构建数组,而忽略没有数据且仅包含基础公式的单元格吗?