powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / DOS-кодировка
14 сообщений из 14, страница 1 из 1
DOS-кодировка
    #35492307
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, у мнея проблема(((
я открываб txt, а он в DOS-кодировке
поэтому, vba видит там каракули. что делать не знаю. Его как-то преобразовать надо в win-кодировку. Причём, видимо, это надо делать каждый раз при открытии.
Помогите плз.
Файл прилагаю.
Код: plaintext
“бм®Ј® Ї®  100  ЈагЇi
это должно быть
Код: plaintext
Усього по  100  групi

Заранее спасибо!
...
Рейтинг: 0 / 0
DOS-кодировка
    #35492692
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: PlanB
> Короче, у мнея проблема(((
> я открываб txt, а он в DOS-кодировке
> поэтому, vba видит там каракули. что делать не знаю. Его как-то преобразовать надо
> в win-кодировку. Причём, видимо, это надо делать каждый раз при открытии.
> Помогите плз.

Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As
String, ByVal lpszDst As String) As Long

?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DOS-кодировка
    #35492729
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да я ж глупый!!!!!!

зацени какую фигню я на поиск забивал. Мне надо избавиться от этого..
про OemToChar я чит. Только как это в данном коде применить я не знаю...
сори я оформление
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
Private Sub CommandButton5_Click()
    naz = ActiveSheet.Name
nnn = Application.GetOpenFilename
If nnn = False Then
    End
End If

Open nnn For Input As # 1 
    Sheets.Add
        ActiveSheet.Name = "1"






'ñòðîêè áàëàíñà
n =  0 
Do While Not EOF( 1 )
    Line Input # 1 , s$
'n = n + 1
ss = Mid(s,  2 ,  20 )



If InStr(ss, "£àã¯i") <>  0  Then
n = n +  1 
    Sheets("1").Cells(n,  1 ) = Val(Mid(s,  11 ,  3 )) '"Èòîãî ïî ãðóïïå " & Val(Mid(s, 11, 3))
    Sheets("1").Cells(n,  2 ) = Mid(s,  20 ,  17 )
ElseIf InStr(s, "€ªâ¨¢¨ - ãáì") <>  0  Then
n = n +  1 
    Sheets("1").Cells(n,  2 ) = Mid(s,  20 ,  17 )
    Sheets("1").Cells(n,  1 ) = "Èòîãî Àêòèâû"
ElseIf InStr(s, "€ªâ¨¢¨ - ãáì") <>  0  Then
End If
Loop
    nd = Worksheets("1").Range("a1").End(xlDown).Row
For i% =  1  To nd
q = Sheets("1").Cells(i,  1 )
w = Sheets("1").Cells(i,  2 )
         If q =  159  Then
            sum3 = sum3 + w
         ElseIf q =  240  Or q =  249  Or q =  289  Then
            sum5 = sum5 + w
         ElseIf q =  149  Or q =  319  Or q =  329  Then
            sum7 = sum7 + w
         ElseIf q =  370  Or q =  371  Or q =  373  Then
            sum9tri = sum9tri + w
         ElseIf q =  359  Then
            sum10 = sum10 + w
         ElseIf q =  292  Then
            sum12tri = sum12tri + w
         ElseIf q =  332  Or q =  333  Or q =  334  Then
            sum13 = sum13 + w
         ElseIf q =  372  Then
            sum14tri = sum14tri + w
         ElseIf q =  500  Then
            ystavn = w
         ElseIf q = "Èòîãî Àêòèâû" Then
            Assets = w
         End If
    q = Mid(q,  1 ,  2 )
        If q =  10  Or q =  12  Then
            sum1 = sum1 + w
        ElseIf q =  15  Then
            sum2 = sum2 + w
        ElseIf q =  20  Or q =  21  Or q =  22  Or q =  24  Or q =  28  Then
            sum4 = sum4 + w
        ElseIf q =  14  Or q =  30  Or q =  31  Or q =  31  Or q =  32  Then
            sum6 = sum6 + w
        ElseIf q =  43  Or q =  44  Then
            sum8 = sum8 + w
        ElseIf q =  11  Or q =  17  Or q =  18  Or q =  34  Or q =  35  Or q =  41  Or q =  42  Or q =  45  Then
            sum9dva = sum9dva + w
        ElseIf q =  13  Or q =  16  Or q =  27  Then
            sum11 = sum11 + w
        ElseIf q =  25  Or q =  26  Then
            sum12dva = sum12dva + w
        ElseIf q =  19  Or q =  29  Or q =  33  Or q =  36  Then
            sum14dva = sum14dva + w
        End If
    q = Mid(q,  1 ,  1 )
        If q =  5  Then
        kap = kap + w
        End If
Next
Close

sum9 = sum9dva + sum9tri
sum12 = sum12dva + sum12tri
sum14 = sum14dva + sum14tri - sum13
'ÀÊÒÈÂ
Sheets("1").Cells( 4 ,  3 ) = sum1
Sheets("1").Cells( 5 ,  3 ) = sum2
Sheets("1").Cells( 6 ,  3 ) = sum3
Sheets("1").Cells( 7 ,  3 ) = sum4
Sheets("1").Cells( 8 ,  3 ) = sum5
Sheets("1").Cells( 9 ,  3 ) = sum6
Sheets("1").Cells( 10 ,  3 ) = sum7
Sheets("1").Cells( 11 ,  3 ) = sum8
Sheets("1").Cells( 12 ,  3 ) = sum9
Sheets("1").Cells( 13 ,  3 ) = sum10
Sheets("1").Cells( 15 ,  3 ) = Assets
'ÎÁßÇÀÒÅËÜÑÒÂÀ
Sheets("1").Cells( 17 ,  3 ) = sum11
Sheets("1").Cells( 18 ,  3 ) = sum12
Sheets("1").Cells( 19 ,  3 ) = sum13
Sheets("1").Cells( 20 ,  3 ) = sum14
'ÊÀÏÈÒÀË
Sheets("1").Cells( 22 ,  3 ) = kap
Sheets("1").Cells( 23 ,  3 ) = ystavn
    Call Perevod_2



 ' Application.DisplayAlerts = False
 '      Sheets("1").Delete
 ' Application.DisplayAlerts = True
End Sub
...
Рейтинг: 0 / 0
DOS-кодировка
    #35492885
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: PlanB
> да я ж глупый!!!!!!

Самокритика это хорошо, НО!
Мне
Google
на первой странице ответил

Оставил только цикл чтения и преобразования

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Option Explicit

Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As 
String, ByVal lpszDst As String) As Long


Private Sub CommandButton5_Click()
Dim s As String, ss As String, s1 As String

Open "D:\012314.TXT" For Input As # 1 
    Do While Not EOF( 1 )
        Line Input # 1 , s
        ss = Mid(s,  2 ,  20 )
        s1 = String(Len(ss), " ")
        Call OemToChar(ss, s1)
        Debug.Print s1
    Loop
Close # 1 
End Sub

З.Ы. Объявляй переменные явно

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DOS-кодировка
    #35492960
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PlanBда я ж глупый!!!!!!

это не самокритика, а правда.
Короче, не работает
Можно разжевать?
...
Рейтинг: 0 / 0
DOS-кодировка
    #35492995
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: PlanB
[ ... Лирика и самоистязания опущены ;) ... ]

> Короче, не работает
Как не работает? Пишет ошибку? или просто ничего не преобразовывает?

> Можно разжевать?

Функция OemToChar предназначена для конвертации текста из ДОС-кодировки в ASCII-кодировку.
В параметрах передается строка которая содержит текст в ДОС-кодировке, и строка, куда
будет положен результат конвертации. Переменную под результат нужно перед использованием
"инициализировать". Что и делается кодом:
s1 = String(Len(ss), " ")
Переменная s1 заполняется пробелами по кольчеству символов, которые содержатся в исходной
строке.
Переиначив код:
Код: plaintext
1.
2.
3.
4.
5.
Line Input # 1 , s
        ss = Mid(s,  2 ,  20 )
        Debug.Print ss
        s1 = String(Len(ss), " ")
        Call OemToChar(ss, s1)
        Debug.Print s1

и на примере твоего файла получаем:

бм®Ј® Ї® 990 ЈагЇi
сього по 990 групi

Это где-то из конца файла.

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DOS-кодировка
    #35493047
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

это и не работает. Ошибка на Declare или на Lib. Я в этой строчке из знакомых слов только Function встретил)))
Проще говоря, без Option Explicit я не обойдусь? Не люблю я переменные объявлять. И так в дедлайны не укладываюсь, а тут ещё смотреть какие переменные и где - вообще умрёшь

Можно мне вариант "для лоха"))) Чтобы код скопировать и он работал?)))
...
Рейтинг: 0 / 0
DOS-кодировка
    #35493068
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: PlanB
> Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As
> String, ByVal lpszDst As String) As Long
> это и не работает. Ошибка на Declare или на Lib. Я в этой строчке из знакомых слов
> только Function встретил)))

Поменяй квалификатор доступа с Public на Private.
Я не обратил внимание что у тебя это в форме выполняется, а я делал в модуле

> Проще говоря, без Option Explicit я не обойдусь? Не люблю я переменные объявлять. И
> так в дедлайны не укладываюсь, а тут ещё смотреть какие переменные и где - вообще умрёшь

Почитай Сопольски о венгерской нотации и немного попривыкнуть нужно. Потом будет просто. А
после можно будет развиваться в
этом направлении

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DOS-кодировка
    #35493242
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Переменную под результат нужно перед использованием
"инициализировать". Что и делается кодом:
s1 = String(Len(ss), " ")

Переусложненный код. Гораздо проще:

s1 = ss

;)
...
Рейтинг: 0 / 0
DOS-кодировка
    #35493439
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: AndrF
> Игорь Горбонос
>
> Переменную под результат нужно перед использованием
> "инициализировать". Что и делается кодом:
> s1 = String(Len(ss), " ")
>
>
> Переусложненный код. Гораздо проще:
>
> s1 = ss
Это до тех пор пока в тексте не встретится \0
сравни результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc 
As String, ByVal lpszDst As String) As Long


Private Sub CommandButton5_Click()
Dim s As String, ss As String, s1 As String
Open "D:\012314.TXT" For Input As # 1 
    Do While Not EOF( 1 )
        Line Input # 1 , s
        ss = Mid(s,  2 ,  20 )
        Debug.Print ss
        s1 = ss 'String(Len(ss), " ")
        Call OemToChar(ss, s1)
        Debug.Print s1
        Mid(ss,  2 ,  1 ) = vbNullChar
        s1 = ss
        Call OemToChar(ss, s1)
        Debug.Print s1
    Loop
Close # 1 
End Sub

Это раз, а два в том, что открывая код 5-7 летней давности, и встречая такую строку я
прекрасно понимаю что это делается именно для передачи этой строки параметром в АПИ
функцию. А на простое присвоение я бы смотрел как баран на новые ворота и пытался бы
понять тайный смысл "лишнего" действия. И удалил-бы "ненужную" строку. А потом с
нецензурными выражениями на устах, восстанавливал-бы справедливость. Наверное просто
привычка сказывается писать одинаково, что-бы потом можно было понять, а что собственно ты
пИсал.

>
> ;)



--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DOS-кодировка
    #35494022
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Private Sub CommandButton5_Click()
    naz = ActiveSheet.Name
nnn = Application.GetOpenFilename
If nnn = False Then
    End
End If

Open nnn For Input As # 1 
    Sheets.Add
        ActiveSheet.Name = "1"
n =  0 
Do While Not EOF( 1 )
    Line Input # 1 , s1
        s = String(Len(s1), " ")
        Call OemToChar(s1, s)
        


ss = Mid(s,  2 ,  20 )
If InStr(ss, "£àã¯i") <>  0  Then
n = n +  1 
    Sheets("1").Cells(n,  1 ) = Val(Mid(s,  11 ,  3 )) '"Èòîãî ïî ãðóïïå " & Val(Mid(s, 11, 3))
    Sheets("1").Cells(n,  2 ) = Mid(s,  20 ,  17 )
ElseIf InStr(s, "€ªâ¨¢¨ - ãáì") <>  0  Then
n = n +  1 
    Sheets("1").Cells(n,  2 ) = Mid(s,  20 ,  17 )
    Sheets("1").Cells(n,  1 ) = "Èòîãî Àêòèâû"
ElseIf InStr(s, "€ªâ¨¢¨ - ãáì") <>  0  Then
End If
Loop
....



возвращает пустую строку s после обращения к OemToChar, не меняет её на перекодированную
...
Рейтинг: 0 / 0
DOS-кодировка
    #35494117
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: PlanB
>
> возвращает пустую строку s после обращения к OemToChar, не меняет её на
> перекодированную

:D Ты не поверишь, НО!
Dim s As String, s1 As String
в начале процедуры, спасут отца русской демократии ;))

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DOS-кодировка
    #35494135
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда...
Вроде и не жарко)) Не на что списать))
Спасибо!
...
Рейтинг: 0 / 0
DOS-кодировка
    #35494164
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: PlanB
> Мда...
> Вроде и не жарко))

У кого как :))
У меня сейчас 36 по цельсию, правда в офисе градусов на 8-10 поменьше будет

> Спасибо!

Да всегда пожалуйста

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / DOS-кодировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]