Excel ComType of Application.Evaluate () для функции конкатенации - PullRequest
0 голосов
/ 09 ноября 2011

Внутри ac # UDF для Excel 2007 мне нужно оценить значение параметров функции Excel (не спрашивайте почему, длинная история).

Допустим, у нас есть эта функция Excel для оценки:

= имя-функции ("2009-01-01"; "B4"; "foo"; concatenate ("a"; "b"))

Моя цель - получить строку с:

= имя-функции ("2009-01-01"; "значение ячейки B4"; "foo"; "ab")

Я оцениваю значение параметров благодаря этому фрагменту:

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

getValueFromComObject detail:

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

Первый и третий параметры нашего примера напрямую возвращаются как String для application.Evaluate.Второй параметр возвращается как диапазон и корректно управляется благодаря приведению типа.

Проблема в четвертом параметре, я не знаю, какой тип приведения используется для оценки функции конкатенации, это явно не диапазон, а toString () дает мне ссылку: -2146826273

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 15 марта 2013

В C Sharp для вычисления формулы мы задаем строку "," для разделения аргументов.В родном приложении Excel мы поставили «;».Для оценки статических значений (например, CONCATENATE («a», «b»)) мы используем метод «Application.Evaluate».Для оценки значений в ячейках (например, CONCATENATE (A1, B1)) мы используем Application._Evaluate.

0 голосов
/ 10 ноября 2011

Хорошо, я обнаружил проблему :)!

Прежде всего тип возвращаемого значения - Int32, а возвращаемое значение соответствует коду ошибки # значение согласно этой странице: Как узнать, является лиЯчейка имеет ошибку в формуле в C #

На самом деле длина строк была слишком длинной для функции сцепления в режиме eval, я пробовал в Excel это работает, но с eval это дает мнеошибка.Поэтому мне просто пришлось уменьшить длину каждой строки в методе сцепления (добавить больше параметров), и это работает.

Спасибо всем за помощь.

...