Excel函数在由后面的代码设置时抛出异常.在excel中使用时可以工作

Dan*_* W. 8 c# excel excel-formula excel-addins addin-express

我已经定义了自己的Excel函数(称为ADXExcelFunctionDeescriptor).方法存根如下所示:

public static object ExecuteMyFunction(object values, object tagName)
{ // Some code here }
Run Code Online (Sandbox Code Playgroud)

该方法接收一个double值数组和一个名为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;
Run Code Online (Sandbox Code Playgroud)

这将导致异常!例外情况如下:

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: 
Run Code Online (Sandbox Code Playgroud)

此外,如果我没有传递tagName参数,该函数将返回一个没有任何异常或错误的结果.

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

所以我认为它与字符串参数有关.我还尝试用"或"字符包围字符串参数但到目前为止没有变化.

此外,如果我直接在Excel中键入函数,它的工作没有任何问题.因此,例如,如果我在Excel中键入以下公式:

=Temp.DoSomething(B2:B13;"Flow")
Run Code Online (Sandbox Code Playgroud)

也许我错过了什么或做错了什么?

Tim*_*ams 6

看起来你不是在构造的UDF字符串公式中的第二个参数tagCaption周围添加引号.该值应该有引号.

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

另外:请参阅Chris Neilsen的评论:Excel - 使用VBA插入公式

在VBA .Formula,.FormulaArray.FormulaR1C1使用国际分隔符(即,)和.FormulaLocal.FormulaR1C1Local使用用户的语言(这样可以使用;,如果这是你的语言设置).所以对于这个OP分配.FormulaArray它是正确的说总是使用,