0

Excel 2007 の ac# UDF 内で、Excel 関数パラメーターの値を評価する必要があります (理由は聞かないでください、長い話です)。

評価するこの Excel 関数があるとします。

=afunctionname("2009-01-01" ; "B4" ; "foo" ; concatenate("a";"b") )

私の目標は、次の文字列を取得することです:

=afunctionname("2009-01-01" ; "B4 セルの値" ; "foo" ; "ab" )

このスニペットのおかげで、params の値を評価します。

Object comObject = app.Evaluate(param); //app = Microsoft.Office.Interop.Excel.Application
String value = getValueFromComObject(comObject);

getValueFromComObject の詳細:

private static String getValueFromComObject(Object comObject)        {
    if ((comObject as Range) != null)
                {
                    Range rge = ((Range)comObject);

                    switch (Type.GetTypeCode(rge.Value.GetType()))
                    {
                        case TypeCode.DateTime:
                            return ((DateTime)rge.Value).ToShortDateString();
                        default:
                            return rge.Value.ToString().Trim();
                    }
                }
                else
                {
                    return comObject.ToString();
                }
}

この例の最初と 3 番目のパラメーターは、 application.Evaluate によって String として直接返されます。2 番目のパラメーターは範囲として返され、型キャストのおかげで正しく管理されます。

問題は 4 番目のパラメーターです。連結関数の評価に適用する必要がある魔女のキャスト タイプがわかりません。明らかに範囲ではなく、toString() から参照が得られます: -2146826273

何か案が?

4

2 に答える 2

0

OK、私は問題を見つけました:) !

まず、戻り値の型は Int32 であり、戻り値はこのページによるとエラー コード #value に対応します: How to know if a cell has an error in the formula in C#

実際、文字列の長さが eval モードの連結関数には長すぎました。Excel で試してみましたが、eval ではエラーが発生します。そのため、連結メソッドで各文字列の長さを短くするだけで(パラメーターを追加して)、機能します。

ご協力ありがとうございました。

于 2011-11-10T08:00:26.153 に答える
0

C Sharp では、引数を区切るために文字列「,」で設定した式を評価します。ネイティブの Excel アプリケーションでは、「;」を付けます。静的な値 (例: CONCATENATE("a","b") ) を評価するには、"Application.Evaluate" メソッドを使用します。セル内の値を評価するには (例: CONCATENATE(A1,B1) )、Application._Evaluate を使用します。

于 2013-03-15T15:44:39.640 に答える