【问题标题】:ExcelDNA Evaluate Formula returns ExcelErrorName for custom UDF'sExcelDNA 评估公式返回自定义 UDF 的 ExcelErrorName
【发布时间】:2017-01-29 08:27:17
【问题描述】:

我正在使用 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())");

【问题讨论】:

  • 好的 - 我可以重现这个。从 VBA 调用它时的 COM 错误是:错误 2029。它可能类似于此错误:support.microsoft.com/en-us/kb/823604,这似乎与名称解析有关。奇怪的是,如果 UDF 名称是第一个参数,它会起作用......

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


【解决方案1】:

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

【讨论】:

  • Evaluate 是否可能需要“,”作为参数分隔符,而不是用户的列表分隔符,这似乎是“;”在这种情况下?
  • Evaluate 需要美国英语字符串,所以大概这会扩展到分隔符
  • 好的,如果 UDF 通过 VBA 工作...也许我的问题与 ExcelDNA 在 Excel 中注册 UDF 的方式有关?
  • @Govert Evaluate 需要“,”作为分隔符,而 ExcelDNA 和 XlCall.xlfEvaluate 可以使用“;”。已经试过了
  • 如果使用逗号和 IsMacroType=False 会发生什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多