2015-07-20 33 views
8

Zdefiniowałem własną funkcję programu Excel (o nazwie ADXExcelFunctionDeescriptor). Kod procedury wygląda następująco:Funkcja programu Excel zgłasza wyjątek po ustawieniu przez kod. Działa, gdy jest używany w programie Excel

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

Metoda otrzymuje tablicę podwójnych wartości i ciąg znaków, zwany nazwą.
W konstrukcji zobaczyć mój ADXExcelFunctionDeescriptor wygląda jak następuje:

enter image description here

zadzwonię i ustawić funkcję przez następujące linie kodu:

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

To spowoduje wyjątek! Wyjątek wygląda następująco:

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: 

Co więcej, jeśli nie przekażę parametru tagName, funkcja zwróci wynik bez żadnego wyjątku lub błędu.

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

Więc myślę, że to ma coś wspólnego z parametrem strun. Próbowałem również otaczać parametr ciąg znaków "lub", ale bez zmian do tej pory

Dalej, jeśli wpiszę funkcję bezpośrednio w Excel działa bez żadnych problemów. Tak, na przykład, jeśli wpiszę następujące formuła w Excelu:

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

Może przegapić coś lub robi coś złego

+0

jaki jest wewnętrzny wyjątek? –

+0

@israelaltar: Wewnętrzny wyjątek ma wartość NULL. –

+1

Czy próbowałeś użyć w swojej formule przecinka = {0} ({1}, {2}) lub dwukropka? –

Odpowiedz

6

nie wygląda jakbyś dodanie cytatów wokół tego drugiego tagCaption parametrów w swojej skonstruowanego wzoru ciąg UDF nie powinno być. kwotuje się wokół tej wartości:

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

także: patrz komentarz Chris Nielsen tu: Excel - Inserting formula with VBA

w VBA .Formula, .FormulaArray i .FormulaR1C1 użytku międzynarodowego separatora (tj ,) i .FormulaLocal i .FormulaR1C1Local używać języka użytkownika (dzięki czemu można użyj ;, jeśli to jest twoje ustawienie językowe). Więc dla tego OP przypisanie .FormulaArray jest poprawne powiedzieć zawsze Użyj ,