Использование нелокализованных формул в автоматизации Excel

Я играл с базовой автоматизацией Excel, используя интерфейс COM, в основном используя IDispatch::Invoke.

Мой тест включал добавление формулы в только что созданный документ Excel. Используя разработанную библиотеку-оболочку, это выглядит так:

sheet.getObject( "Range", "A1" ).set( "Value", 23 );
sheet.getObject( "Range", "A2" ).set( "Value", 42 );
sheet.getObject( "Range", "A3" ).set( "Formula", "=SUMME(A1:A2)" ); // WTF?

Обратите внимание: я использую (немецкое) локализованное имя формулы SUMME здесь вместо идентификатора SUM как и ожидалось. Когда вы делаете то же самое с устройством записи макросов в Excel, сгенерированный код VBA содержит SUM, С помощью SUM в моем коде C ++, я в конечном итоге с #NAME? ошибка в Excel.

от Microsoft документация для Range.FormulaLocal Имущество говорит следующее:

Возвращает или задает формулу для объекта, используя ссылки в стиле A1
на языке пользователя.

(акцент был сделан мной).

Поэтому я надеялся, что с помощью Formula вместо FormulaLocal Я мог бы обойти эти проблемы локализации, но, видимо, это не так.

Можно ли как-нибудь использовать нелокализованные формулы? Я предполагаю, что есть некоторые хорошо скрытые настройки.

1

Решение

Добавление ответа к документу, что я узнал:

Обходной путь для Formula

Чтобы установить Formula собственность, в конечном счете, есть вызов IDispatch::Invoke, который был реализован как

object->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,  // <-- "locale context"DISPATCH_PROPERTYPUT,
&dispparams,
NULL,
&excepinfo,
&argerr ) );

изменения LOCALE_USER_DEFAULT в LOCALE_NEUTRAL имеет эффект, что свойства Formula а также FormulaLocal начать вести себя по-другому. В моей немецкой локализованной установке Excel два вызова

sheet.getObject( "Range", "A3" ).set( "FormulaLocal", "=SUMME(A1:A2)" );
sheet.getObject( "Range", "B3" ).set( "Formula", "=SUM(A1:A2)" );

сделай то же самое сейчас.

В настоящее время это не реальное решение моей проблемы, так как я обычно ожидаю, что вещи, которые не работают, как описано в документации, будут молча ломаться за моей спиной. Доказательство: NumberFormat а также NumberFormatLocal делать то же самое (!), это означает, что я должен использовать локализованные коды формата даты (например, "JJJJ-MM-TT" для ISO 8601) с обоими свойствами.

Обходной путь для NumberFormat

Чтобы создать строку формата: используйте Применение.Международная недвижимость.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]