|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Как определить кодировку строки передаваемой как значение параметра OLE-серверу Excel |
|
|
Как определить кодировку строки передаваемой как значение параметра OLE-серверу Excel
|
![]() Старожил Сообщения: 301 |
Всем доброго времени суток...
Я занимаюсь переводом некоторых разделов справки (UDFs3.chm), а именно касающихся Excel.au3 и Word.au3 В процессе перевода обнаружил множество ошибок, как в тексте справки, примерах, так и багов в самом Excel.au3 И вот собственно занимаюсь их решением ... (некоторые решены своими силами, но для некоторых - знаний в AutoIT мне явно не хватает, нужна помощь коллективного разума ![]() функция _ExcelNumberFormat в составе Excel.au3 - просто не работает в большинстве случаев "разбор полетов" показал, что OLE-сервер Excel получает одним из аргументов к объекту Excel.Application.ActiveSheet.Range(такая-то, такая-то).NumberFormat некорректные строки (для этого аргумента существуют специальные строковые обозначения форматов для ячеек н/п "#,##0.00$" обозначает "currency" (Валюта), в данном случае валюта(по умолчанию) с двумя разрядами) вот этот код вызовет ошибку в значении $sFormat ; *************************************************************** ; Пример 1 - Изменение формата данных в целевом диапазоне ячеек ; ***************************************************************** #include <Excel.au3> Local $oExcel = _ExcelBookNew() ;Создаем новую рабочую книгу и отображает ее ; Циклически заполняем диапазон ячеек случайнвми числами For $y = 1 To 10 For $x = 1 To 10 _ExcelWriteCell($oExcel, Random(1000, 10000), $x, $y) ;Записываем в ячейку случайное целое число из диапазона от 1000 до 100000 Next Next $sFormat = "#,##0.00$" ; "#,##0.00$" - условное строковое обазначение формата "currency" (Валюта) With $oExcel.ActiveSheet .Range(.Cells(1,1),.Cells(5,5)).NumberFormat = $sFormat EndWith MsgBox(0, "_ExcelNumberFormat | Пример 1", "Демонстрация завершена, нажмите ОК") _ExcelBookSaveAs($oExcel, @TempDir & "\Temp.xls", "xls", 0, 1) ; Сохраняем файл в директории временных файлов, перезаписывая если необходимо. _ExcelBookClose($oExcel) ; Закрываем рабочую книгу ; *************************************************************** ; Пример 1 - Изменение формата данных в целевом диапазоне ячеек ; ***************************************************************** #include <Excel.au3> Local $oExcel = _ExcelBookNew() ;Создаем новую рабочую книгу и отображает ее ; Циклически заполняем диапазон ячеек случайнвми числами For $y = 1 To 10 For $x = 1 To 10 _ExcelWriteCell($oExcel, Random(1000, 10000), $x, $y) ;Записываем в ячейку случайное целое число из диапазона от 1000 до 100000 Next Next $sFormat = "[$-F800]dddd, mmmm dd, yyyy" ; "[$-F800]dddd, mmmm dd, yyyy" - условное строковое обазначение формата "long date" (длинная лата) With $oExcel.ActiveSheet .Range(.Cells(1,1),.Cells(5,5)).NumberFormat = $sFormat EndWith MsgBox(0, "_ExcelNumberFormat | Пример 1", "Демонстрация завершена, нажмите ОК") _ExcelBookSaveAs($oExcel, @TempDir & "\Temp.xls", "xls", 0, 1) ; Сохраняем файл в директории временных файлов, перезаписывая если необходимо. _ExcelBookClose($oExcel) ; Закрываем рабочую книгу Мне кажется это может быть вопрос кодировки, вот я и хотел-бы спросить 1) во первых - как узнать в какой кодировке AutoIT передает строку OLE-серверу Excel? 2) во вторых - каким способом можно кодировку строк менять? 3) ну и в третьих - Ваши соображения и предложения, я могу ошибаться, что-то может еще быть связанное с OLE/COM (сложная тема) |
|
------- Отправлено: 12:28, 11-12-2010 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать RUVATA,
Я проверял только в Excel 2003 (рус). Вот, например, такой формат $sFormat = '# ##0,00[$$-409]_ ;[Красный]-# ##0,00[$$-409]\ ' у меня работает. Наверное, у англ. версии формат будет другой, может быть в 2007-ом и 2010-ом тоже. И такой $sFormat = '_-* # ##0,00р._-;-* # ##0,00р._-;_-* "-"??р._-;_-@_-' тоже работает. Длинная дата у меня так $sFormat = 'ДД.ММ.ГГГГ'. |
Отправлено: 13:00, 11-12-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Старожил Сообщения: 301
|
Профиль | Отправить PM | Цитировать madmasles, Может и так...
но смущает вот что... Excel 2007 Rus в столбик циферки к каждой ручками применяем какой ни будь формат потом читаем его в VBA (так де-факто проще получать строковые обозначения форматов, по таблице MSDN задрючишся ![]() Проведи ка у себя такой эксперимент... Открой новую книгу Excel в столбец "A" вертикльно запиши какие ни будь числа (штук 7), потом "руками" поменяй форматы ячеек Alt+F11 откроется редaктор VBA - меню "Insert" > "Module" вставь и выполни вот этот код Sub FormatString() Dim MyRange As Range Set MyRange = Range("A1") Do While MyRange.Value <> "" MyRange.Offset(0, 1).Value = MyRange.NumberFormat Set MyRange = MyRange.Offset(1, 0) Loop End Sub выложи пожалуйста несколько, надо сравнить. PS: У меня формат currency VBA определяет как "#,##0.00$" и при этом AutoIT его не передает именно так, - не работает а "[$-F800]dddd, mmmm dd, yyyy" работает - почему... Протестировал уже на 3-х машинах на 3-х версиях Office: 2007(Eng), 2007(Rus), 2010(Rus). |
------- Отправлено: 13:25, 11-12-2010 | #3 |
![]() Старожил Сообщения: 367
|
Профиль | Отправить PM | Цитировать RUVATA, "ошибочный" код у меня отработал нормально
MS OFfice 2010 Rus x64 MS Win7 Rus x64 |
------- Отправлено: 13:38, 11-12-2010 | #4 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать 123,3 General 23 434,20 #,##0.00 $567,34 _-[$$-409]* #,##0.00_ ;_-[$$-409]* -#,##0.00 ;_-[$$-409]* "-"??_ ;_-@_ 34,00р. _($* #,##0.00_);_($* (#,##0.00);_($* "-"??_);_(@_) 25.02.1900 m/d/yyyy 18 марта 1900 г. [$-F800]dddd, mmmm dd, yyyy 30.03.00 dd/mm/yy;@ 12330,00% 0,00% 4:48:00 [$-F400]h:mm:ss AM/PM 567 1/3 # ?/? -34,00р. $#,##0.00_);[Red]($#,##0.00) Макрос у меня показал формат '$#,##0.00_);[Red]($#,##0.00)', но с ним вываливается ошибка. Посмотрел вручную, там такой '[$$-409]# ##0,00_ ;[Red]-[$$-409]# ##0,00\ '? с ним работает. |
|
Последний раз редактировалось madmasles, 11-12-2010 в 13:51. Отправлено: 13:40, 11-12-2010 | #5 |
![]() Старожил Сообщения: 301
|
Профиль | Отправить PM | Цитировать Цитата kaster:
Теперь осталось найти загвостку... кто шарит в OLE/COM ? madmasles, попробуйте пожалуйста в _ExcelNumberFormat #,##0.00 0,00% # ?/? $#,##0.00_);[Red]($#,##0.00) Все ли работают? |
|
------- Отправлено: 13:52, 11-12-2010 | #6 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать |
Отправлено: 14:08, 11-12-2010 | #7 |
![]() Старожил Сообщения: 301
|
Профиль | Отправить PM | Цитировать Хотя "гора с плеч" стало быть проблема индивидуально у меня, и перевод собственно продолжается
![]() Хотя разобраться стоит дабы описать возможные проблемы. Давайте обсудим - с чем это может быть связанно Еще раз опишу положение вещей: 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.: .Range(такая-то).NumberFormat = $sFormat .Range(такая-то).NumberFormat = $sFormat^ ERROR Вывод Объект получает "[$-F800]dddd, mmmm dd, yyyy" - как есть, а "#,##0.00$" не так как есть PS: Только что проверил аналогичную схему из C# (Visual Studio 2010). и "#,##0.00$" прошел замечательно. madmasles, Отлично... и так проблема все таки есть... но не видно системы... Пока остается лишь тестить пока не выявится закономерность. |
------- Отправлено: 14:12, 11-12-2010 | #8 |
![]() Старожил Сообщения: 367
|
Профиль | Отправить PM | Цитировать Цитата RUVATA:
Цитата RUVATA:
|
||
------- Отправлено: 14:28, 11-12-2010 | #9 |
![]() Старожил Сообщения: 301
|
Профиль | Отправить PM | Цитировать Цитата kaster:
И именно эта проблема лишь одна из нескольких, когда я закончу работу - милости прошу ознакомиться... критика приветствуется ![]() Цитата kaster:
|
||
------- Отправлено: 15:16, 12-12-2010 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Как получить значение параметра из реестра, добавить значение в текстовый файл etc.? | Dark Ange1 | Скриптовые языки администрирования Windows | 28 | 22-06-2022 14:37 | |
2003/XP/2000 - Excel 2003 | Как напечатать определённые строки таблицы? | ondo | Microsoft Office (Word, Excel, Outlook и т.д.) | 3 | 13-07-2010 17:12 | |
VBA - Excel формат ячеек - время! как определить большее?? | SvetlanaK | Программирование и базы данных | 1 | 17-08-2007 15:48 | |
Как в Omni Page распознавать файл переданый в качестве параметра командной строки | madmax24 | Программное обеспечение Windows | 8 | 07-06-2007 19:59 | |
Как определить наличие диска в CD-ROM'е из командной строки? | AT | Хочу все знать | 1 | 02-01-2004 10:37 |
|