Страницы: 1
RSS
Сохранение файла с нужным разделителем
 

Доброго времени суток форум,
Есть ощущение что тема совсем не новая... тем не менее.
Задача написать процедуру, которая из xlsm файла необходимы лист сохранит как CSV фиал на рабочем столе с разделитель как "~"
Спасибо всем кто отзовется.
Код
Sub SaveSheetToCSV()
    ActiveWorkbook.SaveAs Filename:="C:\Users\xyz\Desktop\combine.csv", FileFormat:=xlCSVUTF8, Local:=True, CreateBackup:=False
    ActiveWorkbook.Close SaveChanges:=False
End Sub
 
макросом можно
считать в массив и построчно записать в текстовик
 
Думаю через метод SaveAs не получиться. В макросе путь  для сохранения переменную File подправите как вам надо.
Код
Sub CreateCSV() 'Создание файла csv с помощью Print разделитель задается Rz
Dim Rng As Range, DF1 As Byte, File$, Tp1, Rz$, Ki&, Kj%, i&, j%
Set Rng = ActiveSheet.Cells(1).CurrentRegion
'Set Rng = ActiveSheet.UsedRange
'Set Rng = Selection
    File = ThisWorkbook.Path & "\" & Rng.Parent.Name & ".csv"
Tp1 = Rng.Value: Rz = "~": Ki = Rng.Rows.Count: Kj = Rng.Columns.Count
    DF1 = FreeFile: Open File For Output As #DF1
For i = 1 To Ki
    For j = 2 To Kj
        Tp1(i, 1) = Tp1(i, 1) & Rz & Tp1(i, j)
    Next j
    If i = Ki Then Print #DF1, Tp1(i, 1); Else Print #DF1, Tp1(i, 1)
Next i: Close
End Sub

P.S. Файл вероятнее всего будет в кодировке 1251. Вам наверно надо UTF-8. Тогда надо перед строкой 13 добавить вызов функции перекодировки строки. На просторах инета они есть

Изменено: Евгений Смирнов - 29.12.2021 08:26:22
 
Цитата
написал:
ф*л на рабочем столе

Код
File = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & Rng.Parent.Name & ".csv"
 
Цитата
написал:
в кодировке 1251
Здравствуйте.
Протестировал - все работает. Как вы правильно заметили возникла путаница с кодировками. Нужно в UTF-8.
На всем известных формах отыскал вот такую функцию. Нахватает понимания как ее внедрить в Ваше решение.
Подскажите пожалуйста?
Код
Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, Optional ByVal SourceCharset$) As String
 If Trim(txt$) = "" Then
  ChangeTextCharset = ""
 Else
  On Error Resume Next: Err.Clear
    'SourceCharset$ = "Windows-1251"
    'DestCharset$ = "utf-8"
  With CreateObject("ADODB.Stream")
   .Type = 2
   .Mode = 3
   If Len(SourceCharset$) Then .Charset = SourceCharset$    'Ischodnaja kodirovka
   .Open
   .WriteText txt$
   .Position = 0
   .Charset = DestCharset$                                  'Naznachenie novoji kodirovki
   ChangeTextCharset = .ReadText
   .Close
  End With
 End If
End Function
 
Код
Tp1(i, 1)                                            замените на это
ChangeTextCharset(Tp1(i, 1),"utf-8","Windows-1251")
 
Цитата
написал:
замените на это

должно быть так?
Спасибо

Код
Sub CreateCSV() 'Save data as CSV with "~" delimiter
Dim Rng As Range, DF1 As Byte, File$, Tp1, Rz$, Ki&, Kj%, i&, j%
Set Rng = ActiveSheet.Cells(1).CurrentRegion
    File = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & Rng.Parent.Name & ".csv"
Tp1 = Rng.Value: Rz = "~": Ki = Rng.Rows.Count: Kj = Rng.Columns.Count
    DF1 = FreeFile: Open File For Output As #DF1
For i = 1 To Ki
    For j = 2 To Kj
        Tp1(i, 1) = ChangeTextCharset(Tp1(i, 1), "utf-8","Windows-1251") & Rz & Tp1(i, j)
    Next j
    If i = Ki Then Print #DF1, ChangeTextCharset(Tp1(i, 1), "utf-8","Windows-1251"); Else Print #DF1, ChangeTextCharset(Tp1(i, 1), "utf-8","Windows-1251")
Next i: Close
End Sub

'-----------------------------------------
Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, Optional ByVal SourceCharset$) As String If Trim(txt$) = "" Then
  ChangeTextCharset = ""
 Else
  On Error Resume Next: Err.Clear
    'SourceCharset$ = "Windows-1251"
    'DestCharset$ = "utf-8"
  With CreateObject("ADODB.Stream")
   .Type = 2
   .Mode = 3
   If Len(SourceCharset$) Then .Charset = SourceCharset$    'Ischodnaja kodirovka
   .Open
   .WriteText txt$
   .Position = 0
   .Charset = DestCharset$                                  'Naznachenie novoji kodirovki
   ChangeTextCharset = .ReadText
   .Close
  End With
 End If
End Function
 
Код
Предположу, что вместо
Tp1(i, 1) = ChangeTextCharset(Tp1(i, 1), "utf-8","Windows-1251") & Rz & Tp1(i, j)
должно быть
Tp1(i, 1) = ChangeTextCharset(Tp1(i, 1) & Rz & Tp1(i, j), "utf-8","Windows-1251")
 
Alex D С функцией которую вы нашли (сообщение№5), что-то не так. Вот код вместе с функцией. Файл получиться в кодировке UTF-8 BOM.
Код
Sub CreateCSV() 'Создание файла csv с помощью Print разделитель задается Rz
Dim Rng As Range, DF1 As Byte, File$, Tp1, Rz$, Ki&, Kj%, i&, j%, Txt$
Set Rng = ActiveSheet.Cells(1).CurrentRegion
    File = ThisWorkbook.Path & "\" & Rng.Parent.Name & ".csv"
Tp1 = Rng.Value: Rz = "~": Ki = Rng.Rows.Count: Kj = Rng.Columns.Count
    DF1 = FreeFile: Open File For Output As #DF1
For i = 1 To Ki
    For j = 2 To Kj
        Tp1(i, 1) = Tp1(i, 1) & Rz & Tp1(i, j)
    Next j
Txt = ChangeTextCharset(Tp1(i, 1), "Windows-1251", "utf-8")
    If i = Ki Then Print #DF1, Txt; Else Print #DF1, Txt
Next i: Close
End Sub
Function ChangeTextCharset(ByVal Txt$, ByVal DestCharset$, Optional ByVal SourceCharset$) As String
    On Error Resume Next: Err.Clear
    With CreateObject("ADODB.Stream")
        .Type = 2: .Mode = 3
        If Len(SourceCharset$) Then .Charset = SourceCharset$    ' указываем исходную кодировку
        .Open
        .WriteText Txt$
        .Position = 0
        .Charset = DestCharset$    ' назначаем новую кодировку
        ChangeTextCharset = .ReadText
        .Close
    End With
End Function
Изменено: Евгений Смирнов - 31.12.2021 08:54:26
 
Цитата
написал:
что-то не так
Доброго дня,
@Евгений Смирнов Спасибо что отозвались. Често говоря пробовал по всякому + трyдность возникает в строках такого вида
Например:Paterna Ferrón, Roberto после сохрания макросом Paterna Ferron, Roberto нужно что бы оставалось Paterna Ferrón, Roberto
Для порядка прикрепил macro
Изменено: Alex D - 31.12.2021 14:14:16
 
Цитата
Alex D написал: трyдность возникает в строках такого вида
Например:Paterna Ferrón, Roberto
Вы установите версию Excel для языка, откуда эта буквочка может и не будет проблем
 
Здравствуйте Alex D. С наступившим новым годом всех!
Вчера немного времени было подумать над последним вопросом. Попробовал  функции Chr и Asc, но Asc с этим символом возвращает 111, а на листе функция кодсимв возвращает 63. Вообщем не понял почему так, и что можно сделать. Сегодня со свежей головой после хорошего мятного ликерчика вчера (сын привез попробовать)  и почитав справку по функциям VBA на свежую голову, появились некоторые (возможно умные) мысли. Раз этот символ не из кодовой таблицы 1251, значит его отправлять на перекодировку нельзя. Следовательно алгоритм такой
1.Проверка есть ли в подготовленной для перекодировки строке символ Unicode 243 ( Проверяем оператором Like используя функцию ChrW(243))
2.Если нет перекодируем и отравляем на печать в файл
3.Если есть используя функцию Split  со вторым аргументом ChrW(243) разбиваем строку на подстроки и каждую подстроку отправляем на перекодировку. Затем с помощью функции  Join со вторым аргументом ChrW(243) собираем строку из подстрок и отправляем на печать в файл
Но это для 1 символа, а как проверить строку на содержание символов Unicode не знаю.  Писать код не хочу, вряд ли эти знания мне пригодятся в повседневной жизни  при посадке и уборке картофеля, а также других овощей.

P.S. Надо использовать функцию VBA StrConv с аргументом vbUnicode получим двухбайтовую кодировку, а затем использовать функцию перекодировки в UTF-8. Пока не знаю как все правильно написать.

По моему название темы можно немного изменить. Сохранение данных в текстовом файле с нужным разделителем

Изменено: Евгений Смирнов - 02.01.2022 09:10:47
 
Эта проблематика описана здесь.
Можно соединить два макроса из #9 в один и выводить строки формата csv непосредственно в объект типа ADODB.Stream с кодировкой utf-8 (и никакая дополнительная перекодировка не нужна). В конце макроса можно объект сохранить в файл.
Изменено: sokol92 - 02.01.2022 14:55:06
Владимир
 
Sokol 92 Доброго здоровья Владимир. Спасибо что откликнулись. Гроссмейстеры почему-то молчат, я тут пишу половину ерунды (не специально) никто не поправит. Вчера вечерком маленько почитал. В принципе разобрался с вопросом этой темы. Если использовать файл  в режиме прямого доступа функцию перекодировки надо другую с использованием только VBA. Если использовать объект ADODB.Stream, то данные надо собирать по другому в одну строковую переменную и тогда перекодировать в ADODB.Stream и сразу сохранить в файл методом SaveToFile. Вообщем надо учить VBScript, хотя бы некоторые объекты. Сначала надо filesystemobject тк объект FileSearch убрали из Excel.
 
@Евгений Смирнов,
С прошедшими. Спасибо за отзывчивость :)
После консультации с колегами вот к чему пришел

Порядка, ради. Пример в приложении

Код
Sub CreateCSV()
    Const sDEL As String = "~"  
    Dim rngData As Range, vData As Variant
    Dim strMyFile As String
    Dim i As Long, j As Long
    Dim lRows As Long, lCols As Long
    
    Set rngData = ActiveSheet.Range("A1").CurrentRegion
    vData = rngData.Value
    lRows = UBound(vData, 1)
    lCols = UBound(vData, 2)
    
    strMyFile = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & ActiveSheet.Name & ".csv"
    
    Open strMyFile For Output As #1
        For i = 1 To lRows
            For j = 1 To lCols
                vData(i, 1) = vData(i, 1) & sDEL & vData(i, j)
            Next j
            Print #1, vData(i, 1)
        Next i
    Close #1
End Sub
Изменено: Alex D - 10.01.2022 18:46:14
 
Макрос не решает проблем, указанных в #10.
Владимир
 
В текстовом файле созданным макросом из сообщения №15 последняя строка будет пустая. Отработает символ перевода строки а данных нет.
Дескриптор файла можно конечно назначать самому. Ситуация когда дескриптор 1 окажется занятым маловероятна, но лучше использовать функцию FreeFile  для получения номера свободного дескриптора.
Изменено: Евгений Смирнов - 11.01.2022 05:26:54
Страницы: 1
Наверх