![]() |
Как определить кодировку строки передаваемой как значение параметра OLE-серверу Excel
Всем доброго времени суток...
Я занимаюсь переводом некоторых разделов справки (UDFs3.chm), а именно касающихся Excel.au3 и Word.au3 В процессе перевода обнаружил множество ошибок, как в тексте справки, примерах, так и багов в самом Excel.au3 И вот собственно занимаюсь их решением ... (некоторые решены своими силами, но для некоторых - знаний в AutoIT мне явно не хватает, нужна помощь коллективного разума :) ) (Я опытный VBA-программист, но как AutoIT-эр я новичок) функция _ExcelNumberFormat в составе Excel.au3 - просто не работает в большинстве случаев "разбор полетов" показал, что OLE-сервер Excel получает одним из аргументов к объекту Excel.Application.ActiveSheet.Range(такая-то, такая-то).NumberFormat некорректные строки (для этого аргумента существуют специальные строковые обозначения форматов для ячеек н/п "#,##0.00$" обозначает "currency" (Валюта), в данном случае валюта(по умолчанию) с двумя разрядами) вот этот код вызовет ошибку в значении $sFormat Код:
; *************************************************************** Код:
; *************************************************************** Мне кажется это может быть вопрос кодировки, вот я и хотел-бы спросить 1) во первых - как узнать в какой кодировке AutoIT передает строку OLE-серверу Excel? 2) во вторых - каким способом можно кодировку строк менять? 3) ну и в третьих - Ваши соображения и предложения, я могу ошибаться, что-то может еще быть связанное с OLE/COM (сложная тема) |
RUVATA,
Я проверял только в Excel 2003 (рус). Вот, например, такой формат $sFormat = '# ##0,00[$$-409]_ ;[Красный]-# ##0,00[$$-409]\ ' у меня работает. Наверное, у англ. версии формат будет другой, может быть в 2007-ом и 2010-ом тоже. И такой $sFormat = '_-* # ##0,00р._-;-* # ##0,00р._-;_-* "-"??р._-;_-@_-' тоже работает. Длинная дата у меня так $sFormat = 'ДД.ММ.ГГГГ'. |
madmasles, Может и так...
но смущает вот что... Excel 2007 Rus в столбик циферки к каждой ручками применяем какой ни будь формат потом читаем его в VBA (так де-факто проще получать строковые обозначения форматов, по таблице MSDN задрючишся :)) Проведи ка у себя такой эксперимент... Открой новую книгу Excel в столбец "A" вертикльно запиши какие ни будь числа (штук 7), потом "руками" поменяй форматы ячеек Alt+F11 откроется редaктор VBA - меню "Insert" > "Module" вставь и выполни вот этот код Код:
выложи пожалуйста несколько, надо сравнить. PS: У меня формат currency VBA определяет как "#,##0.00$" и при этом AutoIT его не передает именно так, - не работает а "[$-F800]dddd, mmmm dd, yyyy" работает - почему... Протестировал уже на 3-х машинах на 3-х версиях Office: 2007(Eng), 2007(Rus), 2010(Rus). |
RUVATA, "ошибочный" код у меня отработал нормально
MS OFfice 2010 Rus x64 MS Win7 Rus x64 |
Код:
123,3 General Макрос у меня показал формат '$#,##0.00_);[Red]($#,##0.00)', но с ним вываливается ошибка. Посмотрел вручную, там такой '[$$-409]# ##0,00_ ;[Red]-[$$-409]# ##0,00\ '? с ним работает. |
Цитата:
Теперь осталось найти загвостку... кто шарит в OLE/COM ? madmasles, попробуйте пожалуйста в _ExcelNumberFormat #,##0.00 0,00% # ?/? $#,##0.00_);[Red]($#,##0.00) Все ли работают? |
RUVATA,
Код:
'#,##0.00' не работает, так '# ##0,00' работает. |
Хотя "гора с плеч" стало быть проблема индивидуально у меня, и перевод собственно продолжается :)
Хотя разобраться стоит дабы описать возможные проблемы. Давайте обсудим - с чем это может быть связанно Еще раз опишу положение вещей: AutoIT взаимодействует с Excel по средствам обращения к OLE-серверу запущенного экземпляра программы, именно OLE а не COM, обращение к COM-серверу (особая специфика легко запутаться) Скрипт передает в метод некоему объекту параметр (тип "String" на cтороне Excel) вот здесь кстати у AutoIT проблема ИМХО (нет разделения типов). Пробуем передать "#,##0.00$" однозначно верная для метода строка - нарываемся на ошибку а именно: Код:
D:\Test\test.au3 (20) : ==> The requested action with this object has failed.: Вывод Объект получает "[$-F800]dddd, mmmm dd, yyyy" - как есть, а "#,##0.00$" не так как есть PS: Только что проверил аналогичную схему из C# (Visual Studio 2010). и "#,##0.00$" прошел замечательно. madmasles, Отлично... и так проблема все таки есть... но не видно системы... Пока остается лишь тестить пока не выявится закономерность. |
Цитата:
Цитата:
|
Цитата:
И именно эта проблема лишь одна из нескольких, когда я закончу работу - милости прошу ознакомиться... критика приветствуется :) э-т полезно Цитата:
|
RUVATA, ошибки madmasles, вроде как из-за языка офиса. а вообще да, та библиотека делалась под 2003.
|
kaster,
Цитата:
язык который используется для автоматизации пантеона приложений MS Office назывется VBA (Visual Basic for Applications), фактический являтся языком Visual Basic, ныне эволюционировавший в vb.NET Основная объектная модель приложений Office не изменяется аш с версии 97-го года. Учитывая что язык широко используется на протяжении уже 13-лет - вероятность что в нем есть ошибки такого рода как "не верно работающий метод" - крайне мала, хотя исключать ее все таки нельзя. Но вот что показывает моя практика(с VBA работаю уже около 7 лет), и несколько поставленных экспериментов: 1) Управление программи MS Office из вне, т.е. другими языками, осуществляется как правило через OLE-сервер (COM-сервер используется реже имеет свои особенности реализации, и применяется чаще всего тогда, когда необходимо использовать компоненты Office не запуская само приложение, например широко применялась практика использования модулей MS Word "проверка орфографии" для проверки содержимого тестовых полей программ написанных на том-же C# или vb.NET, даже видел реализацию на Java (хотя там на этот счет есть более лаконичные решения). Взаимодействие с OLE-сервером, происходит по принципу обращения к объектной модели конкретного приложения, обработка обращений в таком случае происходит по правилам VBA но не через него, вы получаете возможность опускать прараметры методов и т.д. Скомпилированные программы написанные на языках: С++ и C#, vb.NET, Java и даже встроенный язык 1C не имеют с этим проблем а AutoIT имеет - вывод напрашивается сам сабой. 2) Природа этой ошибки до сих пор не ясна - не понятно гна каком этапе она возникает: AutoIT передает значение, OLE-сервер обрабатывает и передает в COM, COM-объект принемает, или уже само Приложение реализует инструкции COM. Тут необходимо обладать огромной базой знаний о технологии COM и устройстве Office Excel (у меня таких знаний нет, по крайней мере про COM) |
RUVATA, я имел в виду язык локализации - русский
|
Время: 09:31. |
Время: 09:31.
© OSzone.net 2001-