powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Сохранить в кодировке DOS
25 сообщений из 26, страница 1 из 2
Сохранить в кодировке DOS
    #37273299
AlexVong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сделать чтобы SaveTXTfile сохранял текст в кодировке DOS (866)?
Код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Sub ЭкспортПрайсЛистаВФорматеCSV()
     On Error Resume Next
     Dim sh As Worksheet: Set sh = ActiveSheet    ' обрабатывается активный лист

     ' диапазон ячеек с A5 до последней заполненной ячейки в столбце A
    ' расширенный по горизонтали на 10 столбцов (выгружаются столбцы с A по J)
    Dim ra As Range: Set ra = sh.Range(sh.[A5], sh.Range("A" & sh.Rows.Count).End(xlUp)).Resize(,  10 )

     ' формируем текстовую строку, содержащую текст диапазона в формате CSV
    CSVtext$ = Range2CSV(ra, ";")    ' можно указать другой разделитель столбцов

     ' создаём в папке с файлом XLS подпапку для CSV-прайсов (если такой папки ещё нет)
    CSVfolder$ = ThisWorkbook.Path & "\CSV prices\": MkDir CSVfolder$

     ' формируем имя создаваемого файла CSV (c указанием текущей даты)
    CSVfilename$ = Format(Now, "YYYY MM DD  HH-NN-SS") & ".csv"

     ' сохраняем текстовую CSV-строку CSVtext$ в файл с именем CSVfilename$
    SaveTXTfile CSVfolder$ & CSVfilename$, CSVtext$
End Sub

В модуле также есть функции Range2CSV, SaveTXTfile
Код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Function SaveTXTfile(ByVal filename As String, ByVal txt As String) As Boolean
     On Error Resume Next: Err.Clear
     Set fso = CreateObject("scripting.filesystemobject")
     Set ts = fso.CreateTextFile(filename, True)
     ts.Write txt: ts.Close
     SaveTXTfile = Err =  0 
     Set ts = Nothing: Set fso = Nothing
End Function

Заранее спасибо!
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273323
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexVong,

У метода CreateTextFile есть последний аргумент, отвечающий за кодировку набора символов.
Код: plaintext
1.
2.
3.
Set ts = fso.CreateTextFile(filename, True,False)
'True - создание файла с кодировкой Unicode;
'False – с набором символов ASCII. 
'Если параметр опущен, создается файл с кодировкой ASCII
ничего более Вы из него не сможете получить...
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273327
AlexVong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist, Спасибо
про этот аргумент знаю, он не дает желаемого результата.
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273352
AlexVong,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
' преобразование текстового файла из 'windows-1251' в 'cp866'
' требуется ссылка на библиотеку Microsoft ActiveX Data Objects v2.5 или выше
Sub fromASCIItoOEM(inFile$, outFile$)
Dim st As ADODB.Stream

Set st = New ADODB.Stream
With st
    .Open
    .Charset = "windows-1251"
    .LoadFromFile inFile
    .Charset = "cp866"
    .SaveToFile outFile
    .Close
End With
Set st = Nothing
End Sub
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273358
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробуй камнем,

в inFile$, outFile$ что закидываем
inFile = ???
outFile = ???
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273383
Ципихович Эндрю,
inFile - полный путь к входному файлу
outFile - полный путь к вЫходному файлу (если файл существует, при попытке сохранить поток получим ошибку)
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273396
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробуй камнем, а разве не может быть что
inFile = outFile
????????
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273404
Ципихович Эндрю,
может. Читайте внимательно 10690740
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273418
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробуй камнем,
добавил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub from()

Dim inFile As String
inFile = "N:\1.txt"

Dim outFile As String
outFile = "N:\1111.txt"

Call fromASCIItoOEM(inFile, outFile)

End Sub

Код прогнал. Чтобы понять что произошло, что надо "вытворить" в входном файле, чтобы увидеть результат
высокоинтелектуального труда?????????
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273506
AlexVong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем,
создается файл по содержимому и кодировке один в один с исходным.
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273511
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexVong, да нет видимо, чтобы понять разницу надо что-то предпринять
Скукотища, что надо с файлом "вытворить"??
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273514
AlexVong,
действительно. Не ожидал.
Вторая попытка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub ASCIItoOEM(inFile$, outFile$)
Dim st As ADODB.Stream, st2 As ADODB.Stream

    Set st = New ADODB.Stream
    st.Open
    st.Charset = "windows-1251"
    st.LoadFromFile inFile
    st.Position =  0 
    
    Set st2 = New ADODB.Stream
    st2.Open
    st2.Charset = "cp866"
    st.CopyTo st2
    st2.SaveToFile outFile
    
    st.Close: Set st = Nothing
    st2.Close: Set st2 = Nothing
End Sub
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273515
AlexVong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ципихович Эндрю,
Надо готовый файл перекодировать с 1251 в 866.
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273518
AlexVong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем,
Спасибо!!! То что надо.
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273519
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexVong,
>Надо готовый файл перекодировать с 1251 в 866
Я Вам честно скажу, это не моя тема, то есть пока такие вопросы передо мной не стоят, но так как могут в дальнейшем встать решил разобраться
Что означает словосочетание готовый файл???
и перекодировать с 1251 в 866??
Заранее спасибо
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273521
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович Эндрю сообщает разницу увидел, сейчас пробую вернуть назад
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273535
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
туда и обратно:

Код: 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.
Option Explicit

Sub from_windows_1251_cp866()

Dim inFile As String
inFile = "N:\1.txt"

Dim outFile As String
outFile = "N:\11.txt"

Call windows_1251_cp866(inFile, outFile)

End Sub

' преобразование текстового файла из 'windows-1251' в 'cp866'
' требуется ссылка на библиотеку Microsoft ActiveX Data Objects v2.5 или выше
Sub windows_1251_cp866(inFile$, outFile$)
Dim st As ADODB.Stream, st2 As ADODB.Stream

    Set st = New ADODB.Stream
    st.Open
    st.Charset = "windows-1251"
    st.LoadFromFile inFile
    st.Position =  0 
    
    Set st2 = New ADODB.Stream
    st2.Open
    st2.Charset = "cp866"
    st.CopyTo st2
    'если файл существует, при попытке сохранить поток получим ошибку 3004
    st2.SaveToFile outFile
    
    st.Close: Set st = Nothing
    st2.Close: Set st2 = Nothing
    
End Sub

Sub from_cp866_windows_1251()

Dim inFile As String
inFile = "N:\11.txt"

Dim outFile As String
outFile = "N:\111.txt"

Call cp866_windows_1251(inFile, outFile)

End Sub

' преобразование текстового файла из 'cp866' в 'windows-1251'
' требуется ссылка на библиотеку Microsoft ActiveX Data Objects v2.5 или выше
Sub cp866_windows_1251(inFile$, outFile$)
Dim st As ADODB.Stream, st2 As ADODB.Stream

    Set st = New ADODB.Stream
    st.Open
    st.Charset = "cp866"
    st.LoadFromFile inFile
    st.Position =  0 
    
    Set st2 = New ADODB.Stream
    st2.Open
    st2.Charset = "windows-1251"
    st.CopyTo st2
    'если файл существует, при попытке сохранить поток получим ошибку 3004
    st2.SaveToFile outFile
    
    st.Close: Set st = Nothing
    st2.Close: Set st2 = Nothing
    
End Sub
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273894
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович Эндрю сообщает туда и обратно дало сбой, думаю, зачем плодить лишние макросы, сделал:

Код: 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.
Option Explicit

' преобразование текстового файла из 'windows-1251' в 'cp866'
' требуется ссылка на библиотеку Microsoft ActiveX Data Objects v2.5 или выше
Sub windows_1251_cp866()

Dim inFile As String
inFile = "N:\1.txt"

Dim outFile As String
outFile = "N:\11.txt"

Dim st As ADODB.Stream
Set st = New ADODB.Stream
    st.Open
    st.Charset = "windows-1251"
    st.LoadFromFile inFile
    st.Position =  0 
    
Dim st2 As ADODB.Stream
Set st2 = New ADODB.Stream
    st2.Open
    st2.Charset = "cp866"
    st.CopyTo st2
    'если файл существует, при попытке сохранить поток получим ошибку 3004
    st2.SaveToFile outFile
    
    st.Close: Set st = Nothing
    st2.Close: Set st2 = Nothing
    
End Sub

' преобразование текстового файла из 'cp866' в 'windows-1251'
' требуется ссылка на библиотеку Microsoft ActiveX Data Objects v2.5 или выше
Sub cp866_windows_1251()

Dim inFile As String
inFile = "N:\11.txt"

Dim outFile As String
outFile = "N:\111.txt"

Dim st As ADODB.Stream
Set st = New ADODB.Stream
    st.Open
    st.Charset = "cp866"
    st.LoadFromFile inFile
    st.Position =  0 
    
Dim st2 As ADODB.Stream
Set st2 = New ADODB.Stream
    st2.Charset = "windows-1251"
    'ошибка 3001 аргументы немеют не верный тип
    'выходят за пределы допустимого диапазона
    'или вступают в конфликт друг с другом
    st.CopyTo st2
    'если файл существует, при попытке сохранить поток получим ошибку 3004
    st2.SaveToFile outFile
    
    st.Close: Set st = Nothing
    st2.Close: Set st2 = Nothing
    
End Sub

получил
'ошибка 3001
??????
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273961
Ципихович Эндрю,
st2.Open где-то потерял.
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37273988
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробуй камнем, согласен, ОК!!
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37288158
rubberman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток всем!

Вопрос по функции Range2CSV (от EducatedFool)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function Range2CSV(ByRef ra As Range, Optional ByVal ColumnsSeparator$ = ";", _
                   Optional ByVal RowsSeparator$ = vbNewLine) As String
    If ra.Cells.Count =  1  Then Range2TXT = ra.Value & RowsSeparator$: Exit Function
    If ra.Areas.Count >  1  Then
        Dim ar As Range
        For Each ar In ra.Areas
            Range2CSV = Range2CSV & Range2CSV(ar, ColumnsSeparator$, RowsSeparator$)
        Next ar
        Exit Function
    End If
    arr = ra.Value
    buffer$ = ""    ' иначе конкатенация длинных текстовых строк притормаживает макрос
   For i = LBound(arr,  1 ) To UBound(arr,  1 )
        txt = "": For j = LBound(arr,  2 ) To UBound(arr,  2 ): txt = txt & ColumnsSeparator$ & arr(i, j): Next j
        Range2CSV = Range2CSV & Mid(txt, Len(ColumnsSeparator$) +  1 ) & RowsSeparator$
        ' для многократного увеличения производительности при больших диапазонах данных
       If Len(Range2CSV) >  50000  Then buffer$ = buffer$ & Range2CSV: Range2CSV = ""
    Next i
    Range2CSV = buffer$ & Range2CSV
End Function
Если есть диапазон A1:A150, который состоит из формул (если в строке найдено значение - то выводится результат, если нет - то <пусто> или любой заданный текст, напр. "---")
Нужно перенести только строки со значением (из этого диапазона) в текстовый файл.
Пример:
---
---
---
---
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37288162
rubberman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/предыдущее сообщение не актуально - случайно отправил/

Доброго времени суток всем!

Вопрос по функции Range2CSV (от EducatedFool)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function Range2CSV(ByRef ra As Range, Optional ByVal ColumnsSeparator$ = ";", _
                   Optional ByVal RowsSeparator$ = vbNewLine) As String
    If ra.Cells.Count =  1  Then Range2TXT = ra.Value & RowsSeparator$: Exit Function
    If ra.Areas.Count >  1  Then
        Dim ar As Range
        For Each ar In ra.Areas
            Range2CSV = Range2CSV & Range2CSV(ar, ColumnsSeparator$, RowsSeparator$)
        Next ar
        Exit Function
    End If
    arr = ra.Value
    buffer$ = ""    ' иначе конкатенация длинных текстовых строк притормаживает макрос
   For i = LBound(arr,  1 ) To UBound(arr,  1 )
        txt = "": For j = LBound(arr,  2 ) To UBound(arr,  2 ): txt = txt & ColumnsSeparator$ & arr(i, j): Next j
        Range2CSV = Range2CSV & Mid(txt, Len(ColumnsSeparator$) +  1 ) & RowsSeparator$
        ' для многократного увеличения производительности при больших диапазонах данных
       If Len(Range2CSV) >  50000  Then buffer$ = buffer$ & Range2CSV: Range2CSV = ""
    Next i
    Range2CSV = buffer$ & Range2CSV
End Function

Если есть диапазон A1:A150, который состоит из формул (если в строке найдено значение - то выводится результат, если нет - то <пусто> или любой заданный текст, напр. "---")
Нужно перенести только строки со значением (из этого диапазона) в текстовый файл.
Пример:
---
---
---
Иванов А.Н.
---
---
Петров
---
---
---
---
---
---
Сидоров
---
---
и т.п.

Результат:
Иванов А.Н.
Петров
Сидоров


Помогите пожалуйста со внесением изменения в функцию Range2CSV.

Спасибо
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37288423
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rubberman,
например,
Код: plaintext
1.
2.
...
For j = LBound(arr,  2 ) To UBound(arr,  2 ): txt = txt & iif(len(arr(i,j))> 0  and arr(i,j)<>"---", ColumnsSeparator$ & arr(i, j), "") : Next j
...

Кстати, народ, обратите внимание на строку
Код: plaintext
    If ra.Cells.Count = 1 Then Range2TXT = ra.Value & RowsSeparator$: Exit Function
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37290350
rubberman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,

Спасибо. Только результат:



Иванов А.Н.


Петров






Сидоров


и т.п.

А мне нужно перенести только строки со значением (из этого диапазона) в текстовый файл, чтобы результатом было:
Иванов А.Н.
Петров
Сидоров


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Function Range3CSV(ByRef ra As Range, Optional ByVal ColumnsSeparator$ = ";", _
                   Optional ByVal RowsSeparator$ = vbNewLine) As String
    If ra.Cells.Count =  1  Then Range3CSV = ra.Value & RowsSeparator$: Exit Function
    If ra.Areas.Count >  1  Then
        Dim ar As Range
        For Each ar In ra.Areas
            Range3CSV = Range3CSV & Range3CSV(ar, ColumnsSeparator$, RowsSeparator$)
        Next ar
        Exit Function
    End If
    arr = ra.Value
    buffer$ = ""
    For i = LBound(arr,  1 ) To UBound(arr,  1 )
        txt = "": For j = LBound(arr,  2 ) To UBound(arr,  2 ): txt = txt & IIf(Len(arr(i, j)) >  0  And arr(i, j) <> "---", ColumnsSeparator$ & arr(i, j), ""): Next j
        Range3CSV = Range3CSV & Mid(txt, Len(ColumnsSeparator$) +  1 ) & RowsSeparator$
        If Len(Range3CSV) >  50000  Then buffer$ = buffer$ & Range3CSV: Range3CSV = ""
    Next i
    Range3CSV = buffer$ & Range3CSV
End Function

Помогите дожать функцию! Хэлп!!!
...
Рейтинг: 0 / 0
Сохранить в кодировке DOS
    #37292533
rubberman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rubberman,

Вопрос ещё актуальный. Очень помощь нужна.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Сохранить в кодировке DOS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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