Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Как определить кодировку строки передаваемой как значение параметра OLE-серверу Excel

Ответить
Настройки темы
Как определить кодировку строки передаваемой как значение параметра OLE-серверу Excel

Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: RUVATA
Дата: 11-12-2010
Всем доброго времени суток...
Я занимаюсь переводом некоторых разделов справки (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 - Изменение формата данных в целевом диапазоне ячеек
; *****************************************************************
#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

 

Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить 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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить 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


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


RUVATA, "ошибочный" код у меня отработал нормально
MS OFfice 2010 Rus x64
MS Win7 Rus x64

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 13:38, 11-12-2010 | #4


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить 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)
RUVATA,
Макрос у меня показал формат '$#,##0.00_);[Red]($#,##0.00)', но с ним вываливается ошибка. Посмотрел вручную, там такой '[$$-409]# ##0,00_ ;[Red]-[$$-409]# ##0,00\ '? с ним работает.

Последний раз редактировалось madmasles, 11-12-2010 в 13:51.


Отправлено: 13:40, 11-12-2010 | #5


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить PM | Цитировать


Цитата kaster:
"ошибочный" код у меня отработал нормально »
так это уже что-то...
Теперь осталось найти загвостку...
кто шарит в OLE/COM ?

madmasles, попробуйте пожалуйста в _ExcelNumberFormat
#,##0.00
0,00%
# ?/?
$#,##0.00_);[Red]($#,##0.00)
Все ли работают?

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Отправлено: 13:52, 11-12-2010 | #6


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


RUVATA,
Код: Выделить весь код
'#,##0.00' не работает, так '# ##0,00' работает.
0,00% работает.
'# ?/?' не работает, так '#" "?/?' работает.
'$#,##0.00_);[Red]($#,##0.00)' не работает, так '0,00_ ;[Красный]-0,00\ ' работает.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:08, 11-12-2010 | #7


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить 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" однозначно верная для метода строка - Ошибки не происходит.
Вывод
Объект получает "[$-F800]dddd, mmmm dd, yyyy" - как есть, а "#,##0.00$" не так как есть

PS: Только что проверил аналогичную схему из C# (Visual Studio 2010).
и "#,##0.00$" прошел замечательно.

madmasles, Отлично...
и так проблема все таки есть... но не видно системы...
Пока остается лишь тестить пока не выявится закономерность.

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Отправлено: 14:12, 11-12-2010 | #8


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


Цитата RUVATA:
проблема индивидуально у меня »
это всегда должно быть ключевым моментом при выдвижении заявлений, по типу
Цитата RUVATA:
обнаружил множество ошибок, как в тексте справки, примерах, так и багов в самом Excel.au3 »
я к тому, что сообщество и создатели языка довольно тщательно следят за тем, что идет в стандартную поставку, и вероятность ошибок хоть и есть, но, уверен, сведена к минимуму.

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 14:28, 11-12-2010 | #9


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить PM | Цитировать


Цитата kaster:
проблема индивидуально у меня » »
Между прочим - оказалось не индивидуально у меня... см. о чем пишет madmasles.
И именно эта проблема лишь одна из нескольких, когда я закончу работу -
милости прошу ознакомиться... критика приветствуется э-т полезно

Цитата kaster:
что сообщество и создатели языка довольно тщательно следят за тем »
Я ни коим случаем не умоляю труда проделанного сообществом, просто с момента составления именно этой UDF "много воды утекло" и основным фактором является появление принципиально отличающейся платформы Office 2007-2010, лвиная доля связанна именно с этим, но и в 2003 видимо кое что изменилось, так что я скорее не исправляю ошибки а делаю поправку на текущее положение вещей.

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Отправлено: 15:16, 12-12-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Как определить кодировку строки передаваемой как значение параметра OLE-серверу Excel

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход