ExcelDNA Evaluate Formula возвращает ExcelErrorName для пользовательских UDF

Я использую ExcelDNA для написания пользовательских 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 не может вычислить формулу.

Я также попытался использовать метод взаимодействия с Excel, который возвращает соответствующую ошибку COM:

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())");

person Dustin Kremer    schedule 21.09.2016    source источник
comment
ОК - я могу воспроизвести это. Ошибка COM при вызове этого из VBA: Ошибка 2029. Это может быть похоже на эту ошибку: support.microsoft.com/en-us/kb/823604, что, похоже, связано с разрешением имени. Странно, что это работает, если первым параметром является имя UDF...   -  person Govert    schedule 22.09.2016


Ответы (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
person Charles Williams    schedule 21.09.2016
comment
Возможно, Evaluate требует разделителя параметров , вместо разделителя пользовательского списка, который кажется ; в этом случае? - person Govert; 21.09.2016
comment
Evaluate нужны строки английского языка США, поэтому, по-видимому, это распространяется на разделители - person Charles Williams; 21.09.2016
comment
Хорошо, если UDF через VBA работают... Может быть, моя проблема связана с тем, как ExcelDNA регистрирует UDF в Excel? - person Dustin Kremer; 21.09.2016
comment
@Govert Evaluate нуждается в качестве разделителя, тогда как ExcelDNA и XlCall.xlfEvaluate прекрасно подходят для ;. Это уже пробовал - person Dustin Kremer; 21.09.2016
comment
Что произойдет, если вы используете запятые и IsMacroType=False? - person Charles Williams; 21.09.2016
comment
@DustinKremer Что такое CONCAT? И можете ли вы подтвердить, что =CONCATENATE(NOW(); NOW()) работает? - person Govert; 21.09.2016
comment
@Govert, да, я имел в виду СЦЕПИТЬ, и да, использование СЕЙЧАС в качестве параметров работает, как и ожидалось. - person Dustin Kremer; 22.09.2016