Показать сообщение отдельно
Старый 16.04.2009, 17:31   #30  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Тема, на самом деле, интересная и до конца не решенная.
В интернете ответа пока не нашёл, но нашёл достаточно подробное описание проблемы:
http://www.gotdotnet.ru/Forums/Windows/107618.aspx
Цитата:
Сообщение от туда
Проблема состоит в следующем. Мне надо сформировать из проекта на C# таблицу в Excel. В ней кроме данных должны присутствовать и формулы - самые простые - Сумма. Проблема в том, что в разных версиях Excel функции называются по разному - СУММ() в русской версии, и SUM() - в английской. Мне надо, чтобы выходная таблица корректно формировалась независимо от локализации Excel'я. Среди свойств ячейки (диапазона) есть Formula и FormulaLocal. Как я полагал, в свойстве FormulaLocal хранится локализованный вариант формулы ( например, СУММ(E2:E8) ), а в Formula - независимый от локализации (то есть - SUM(E2:E8) ). Но когда я присваиваю при формировании таблицы из моей программы свойству Formula нужной ячейки значение "=SUM(E2:E8)", Excel его не понимает (экспериментирую с русской версией). Понимает только "=СУММ(E2:E8)". С русской версией Excel моя программа будет работать нормально, а как быть, если на машине пользователя стоит английская версия?
..........
(вопрошающему отвечают, но, как оказывается, не совсем удачно):
Используйте свойство Formula. Присваивайте ему формулу в АНГЛИЙСКОМ варианте.
Пример: Range("A10").Formula = "=SUM(A1:A9)"
В этом случае свойство FormulaLocal вернет правильную локализованную версию формулы: "=СУММ(A1:A9)" для русского офиса.
..........
В том то и дело, что это не работает. Я это указал в начальном письме. Если я присваиваю свойству Formula значение "=SUM(A1:A9)", то в ячейке появляется сообщение "#ИМЯ?", т.е. - формула содержит нераспознанный текст. А если я пишу макрос напрямую на VBA, не через C#, то тогда все нормально. Этот глюк не изменился и после апдейта на Office XP. Вот я и задал этот вопрос - может дело еще в чем-то.
Предлагаю Antoncheg'у и всем желающим поучаствовать в небольшом эксперименте, запустив следующий маленький джобик. Разыскиваются люди, у которых в боксе будет выдано значение 2.
X++:
static void Job161_TestFormula(Args _args)
{
    COM xlApp = new COM ('Excel.Application');
    COM wbk;
    COM rng;
    COMVariant cv;
    ;
    wbk = xlApp.Workbooks();
    wbk = wbk.Add();
    rng = xlApp.Range('A1');

    rng.Formula('=СУММ(1+1)'); 
    cv = rng.Text();

    // здесь ожидаются значения: #NAME? или #ИМЯ? или 2
    box::info(cv.bStr()); 

    wbk.Close(false); // чтобы не оставался скрытый экземпляр Excel
    xlApp.Quit();
}
Припоминаю, что эта проблема возникала у Ивана Кашперука в теме: Помогите сделать действие в Excel через COM . И мы тогда никакого вразумительного ответа не нашли, кроме того, что зафиксировали проблему