Функция Excel выдает исключение, если она установлена ​​кодом позади. Работает при использовании в excel

Я определил свою собственную функцию Excel (названную ADXExcelFunctionDeescriptor). Заглушка метода выглядит следующим образом:

public static object ExecuteMyFunction(object values, object tagName)
{ // Some code here }

Метод получает массив двойных значений и строку с именем name.
В режиме конструктора мой ADXExcelFunctionDeescriptor выглядит следующим образом:

введите здесь описание изображения

Я вызываю и устанавливаю функцию следующими строками кода:

var formula = string.Format(@"={0}({1};{2})", Temp.FORMULA_NAME, this.DataRangeTextBox.Text, tagCaption);
resultRange.set_Value(Type.Missing, formula);
resultRange.Formula = resultRange.Value;

Это приведет к исключению! Исключение выглядит следующим образом:

System.Runtime.InteropServices.COMException occurred
  HResult=-2146827284
  Message=Ausnahme von HRESULT: 0x800A03EC
  Source=""
  ErrorCode=-2146827284
  StackTrace:
       bei System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
       bei Microsoft.Office.Interop.Excel.Range.set_Value(Object RangeValueDataType, Object )
       bei bb.ExcelToolbar.Controls.bbControl.ApplyFormula(Object sender, EventArgs e) in c:\xx\yy\zz\bb\bb.ExcelToolbar\Controls\bbControlcs:Zeile 88.
  InnerException: 

Кроме того, если я не передам параметр tagName, функция вернет результат без каких-либо исключений или ошибок.

var formula = string.Format(@"={0}({1})", Temp.FORMULA_NAME, this.DataRangeTextBox.Text, tagCaption);
resultRange.set_Value(Type.Missing, formula);
resultRange.Formula = resultRange.Value;

Поэтому я думаю, что это как-то связано со строковым параметром. Я также пытался окружить строковый параметр символами " или ', но пока без изменений.

Далее, если я ввожу функцию прямо в Excel, она работает без проблем. Так, например, если я наберу следующую формулу в Excel:

=Temp.DoSomething(B2:B13;"Flow")

Может я что-то упускаю или делаю что-то не так?


person Daniel W.    schedule 20.07.2015    source источник
comment
что такое внутреннее исключение?   -  person israel altar    schedule 20.07.2015
comment
@israelaltar: внутреннее исключение равно NULL.   -  person Daniel W.    schedule 20.07.2015
comment
Пробовали ли вы использовать запятую ={0}({1},{2}) или двоеточие в формуле?   -  person Shak Ham    schedule 29.07.2015
comment
Ваш UDF настроен на прием 2 аргументов object, не лучше ли использовать Excel.Range и string в качестве типов?   -  person SierraOscar    schedule 29.07.2015


Ответы (1)


Не похоже, что вы добавляете кавычки вокруг этого второго параметра tagCaption в построенной формуле строки UDF. Вокруг этого значения должны быть кавычки.

var formula = string.Format(@"={0}({1};""{2}"")",Temp.FORMULA_NAME, 
                              this.DataRangeTextBox.Text, tagCaption);

Также: см. комментарий Криса Нильсена здесь: Excel - Вставка формулы с помощью VBA

в VBA .Formula, .FormulaArray и .FormulaR1C1 используйте международный разделитель (т.е. ,), а .FormulaLocal и .FormulaR1C1Local используйте язык пользователя (поэтому можно использовать ;, если это ваша языковая настройка). Таким образом, для этого назначения OP .FormulaArray правильно всегда использовать ,

person Tim Williams    schedule 31.07.2015