Вопрос по OemToChar

Программирование на Visual Basic for Applications
oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Вопрос по OemToChar

Сообщение oskolok_vatbI » 23.06.2011 (Чт) 10:59

Здравствуйте, подскажите, что я делаю не так. Мне нужно из бинарного файла вытащить текстовую таблицу и вставить ее в документ word. Сложность в том, что она в кодировке DOS и ни как не получается ее поменять. Делаю так:
Код: Выделить всё
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" ( _
   lpszSrc As String, ByVal lpszDst As String) As Long
   
Sub Макрос1()
Const RegExKvu As String = "===========================================" 'От этой строки начинается таблица
Dim KVU_path As String           'Путь к файлу
Dim KVU_AllText As String        'Содержимое файла в DOS кодировке
Dim KVU_InsertText As String     'Текст для вставки в документ
Dim KVU_Win As String            'Текст в кодировке WIN
Dim fN As Long

KVU_path = "d:\2_KVU.REP"

'Считываю все содержимое файла
fN = FreeFile
Open KVU_path For Binary As fN
    KVU_AllText = String$(LOF(fN), vbNullChar)
    Get #fN, , KVU_AllText
Close #fN

'Выкусываю из всего содержимого нужный мне текст
KVU_InsertText = Mid(KVU_AllText, _
InStr(KVU_AllText, RegExKvu) + Len(RegExKvu), _
Len(KVU_AllText) - InStr(1, KVU_AllText, RegExKvu))

'Так печатается нужный мне кусок в кодировке DOS
Debug.Print KVU_InsertText

'Пытаюсь изменить кодировку способом найденным тут, на vbstreets
KVU_Win = Space(Len(KVU_InsertText))
OemToChar KVU_InsertText, KVU_Win

'Выводится не текст, а только несколько кракозябр
Debug.Print KVU_Win
End Sub


Либо я файл не так считываю, либо кодировку не так меняю. На всякий случай прикреплю пример файла. Очень надеюсь на вашу помощь.
Вложения
2_KVU.zip
(1007 байт) Скачиваний: 147

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Вопрос по OemToChar

Сообщение ger_kar » 23.06.2011 (Чт) 21:48

Как всегда, причина проста до банальности, а виной всему банальная невнимательность ;)
В объявлении ф-ции OemToChar, перед первым параметром передаваемым функции пропущен ByVal.
Кстати странная вещь человеческая психология. Глянул на чужой код и сразу заметил ошибку, а бывает такую же свою нахожу только изрядно потрудившись и убив не один час времени. И самое интересное, чем ошибка банальнее, тем менее заметна.
Бороться и искать, найти и перепрятать

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Вопрос по OemToChar

Сообщение oskolok_vatbI » 24.06.2011 (Пт) 15:53

2 дня !!! 2 дня я ломаю голову и рассматриваю примеры в интернете, пытаясь найти отличия )))
Спасибо большое !

Добавлено:
Если вставлять табличку из файла через Ctrl+C Ctrl+V, то границы таблицы нарисованные спец. символами выглядят приятнее. Как бы мне добиться такого вида таблицы через считывание файла ?
В другую кодировку (не WIN) преобразовывать или через замену символов на соответствующие спецсимволы ?
Код: Выделить всё
Т.е. чтобы вместо получившегося такого:
г===T==========T=======T=======T========T=======T=======T======¬
¦ N:¦   ДАТА   ¦ ВРЕМЯ ¦ ВРЕМЯ ¦ДАВЛЕНИЕ¦ ДЕБИТ,¦ДЕПРЕС-¦КОЭФФ.¦
¦   ¦          ¦ абсол.¦ относ.¦        ¦       ¦ СИЯ,  ¦ ПРОД-¦
¦п/п¦ дд.мм.гг ¦час.мин¦час.мин¦   Атм  ¦ м3/сут¦  Атм  ¦НОСТИ ¦
¦===+==========+=======+=======+========+=======+=======+======¦

Выглядело так:
╔═══╦══════════╦═══════╦═══════╦════════╦════════╦═══════╦═══════╦═══════╗
║ N:║   ДАТА   ║ ВРЕМЯ ║ ВРЕМЯ ║ УРОВНИ,║  ВНР,  ║ ДЕБИТ,║ДЕПРЕС-║ КОЭФФ.║
║   ║          ║ абсол.║ относ.║        ║        ║       ║ СИЯ,  ║ ПРОД- ║
║п/п║ дд.мм.гг ║час.мин║час.мин║    м   ║    м   ║ м3/сут║  Атм  ║ НОСТИ ║
╠═══╬══════════╬═══════╬═══════╬════════╬════════╬═══════╬═══════╬═══════╣


Спасибо.

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Вопрос по OemToChar

Сообщение oskolok_vatbI » 30.06.2011 (Чт) 14:52

Ну о-о-очень нужно, подскажите пожалуйста. Я через использование этого макроса кучу времени буду экономить !

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.06.2011 (Чт) 15:00

Точно не знаю, но думаю, что Вы делаете перекодирование в Win1251, которая не содержит этих символов. Для того, чтобы их использовать необходим Unicode. К сожалению, точнее сказать не могу.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Вопрос по OemToChar

Сообщение ger_kar » 30.06.2011 (Чт) 16:04

oskolok_vatbI писал(а):Выглядело так:
И сразу вопрос, а где выглядело? В блокноте или в каком другом приложении и какой шрифт при этом использовался? Далее происходит вставка в Word, в Worde при этом тот же шрифт используется? Судя по начальной таблице используется какой-то шрифт с элементами псевдографики. Если вставлять через Ctrl+C Ctrl+V, то текст вставляется с сохранением форматирования, т.е. шрифт сохраняется. А посредством макроса вставляется неформатированный текст и шрифт соответственно используется по умолчанию, т.е. не тот который был изначально. И если дело в шрифте, то вопрос решается очень просто, при вставке форматировать вставляемый текст (устанавливать нужный шрифт). А может конечно дело быть и не в шрифте, тогда как предлагает Qwertiy можно не меняя шрифт попробовать разные кодировки. Если эти советы окажуться "пальцем в небо", то выкладывай результат, подумаем дальше.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.06.2011 (Чт) 16:19

Попробуйте заменить OemToCharA на OemToCharW.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Вопрос по OemToChar

Сообщение ger_kar » 30.06.2011 (Чт) 16:32

Да кстати сейчас произвел небольшое исследование в worde и выяснил, что например моноширинный шрифт "Courier New" в кодировке Юникод имеет больший набор символов, чем в ANSI (Win). В кодировке Юникод как раз имеется набор который называется "части рамок", видимо из этого набора и построена таблица. Так что пробуй совет Qwertiy, я тоже думаю, что это должно помочь.
Бороться и искать, найти и перепрятать


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList