Страницы: 1
RSS
Сохранение спецсимволов в csv
 
Привет, планета! Столкнулся с такой проблемой, что пересохраняя *.xlsx в *.cvs (офис 16-ый) символы дробей (½, ⅓, ⅔) кодируются как знаки вопроса (?).
Если кто-то сталкивался с этим делом и знает решение — облегчите, пожалуйста, поиски, затянувшиеся на второй час... Перепробовал несколько найденных предложенных вариантов — не помогло. Прикрепляю файл для примера
 
Так CSV это текстовый файл. Там с форматированием туго...Попробуйте сделать дроби руками в текстовом файле для отдельных символов - получится?

В общем же, если эти дроби - результат вставки символа в ячейки - посмотрите из какого набора эти символы вставлялись и при какой кодировке. Назначить кодировку файлу txt такую же. Потом можно тупо сменить расширение на CSV
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
В переменной txt_ вопросы, но после создания файла всё гуд.
Код
Sub uuu()
    Dim txt_$, file_$
'---------------------
    file_ = ThisWorkbook.Path & "\пример_csv.csv"
    txt_ = Join(Array([A1], [A2], [A3]), vbCrLf)
    With CreateObject("ADODB.Stream")
        .Type = 2: .Charset = "utf-8"
        .Open
        .WriteText txt_
        .SaveToFile file_, 2
        .Close
    End With
    Beep
End Sub
 
Сперва применением макроса (файл csv при этом полностью пустым становится — почему?), затем открытием файла csv и копированием в него спецсимволов, затем сохранением его как Текст Юникод (*.txt), а затем ручной сменой расширения txt на csv спецсимволы в csv отображаются корректно. А можно ли всё это делать сразу автоматом из исходного файла xlsx?
 
Основная проблема в том, что после обработки макросом csv-файла он получается пустым, а далее я руками снова туда дроби вставляю перед сохранением как txt. Это нам не подходит, значения со спецсимволами другой макрос передаёт, вручную там не вмешаешься, да и не нужно...
 
Какая обработка? Макрос берёт 3 ячейки, как в вашем примере, делает из них строку и сохраняет эту строку в отдельный файл. Что вы там делаете, что файл становится пустым я не знаю.
 
Секунду, кажется, решил вопрос. Всё просто.
 
Цитата
kalbasiatka написал: Макрос берёт 3 ячейки
Только он их не берёт)
 
Хватит тянуть животное на аве за маракасы, выкладывайте нормальный файл и то что нужно получить в итоге.
 
Конкретно этот макрос вообще непонятно что берёт... Он не открывает никакой файл для считывания, просто открывает новый csv и сохраняет его кладя в него переменную text_ которая пустая.

А задача вроде бы решилась простым сохранением xlsx как текст unicode, а затем просто меняем расширение на csv
 
Ну раз проблема сама решилась, пойду и я.
 
Оптимальное и окончательное решение проблемы (надеюсь, кому-то пригодится):
Код
Sub Macro()
    Dim NewFileName As String, fso As New Scripting.FileSystemObject
    
    NewFileName = ThisWorkbook.Path & "\" & fso.GetBaseName(ActiveWorkbook.Name) & ".csv"
    
    ActiveSheet.SaveAs FileName:=NewFileName, FileFormat:=xlUnicodeText, CreateBackup:=False
    
    Application.Quit
    ActiveWorkbook.Close False
End Sub
Просто пересохраняет исходный *.xlsx в этой же директории и с этим же названием, но в формате *.csv и с кодировкой UTF-8 (в которой спецсимволы, например, дроби, сохраняются и отображаются корректно).

Единственное — чтобы получить имя файла без расширения используется способ, для которого нужно подключить одну библиотеку в VBA Editor (поставить галочку в Tools —> References). Скрин прикрепляю.
 
Можно не подключать библиотеку - достаточно написать так:
Код
Dim NewFileName As String, fso As Object
Set fso = CreateObject("scripting.filesystemobject")
А вообще мне больше нравится решение kalbasiatka -никих лишних строк в файле. Но конечно выбирать не мне, и нужно выбирать по конечному рабочему результату.
Изменено: Hugo - 02.12.2015 09:40:41
 
Hugo, спасибо за апгрейд с обжектом!)

Что касается решения kalbasiatka, при очень большом уважении, у меня оно не работает... Неужто у вас работает?

А если не заморачиваться с тем, чтобы csv назывался также, как исходный файл, а просто задать его имя вручную, то в предложенном мной конечном варианте и вовсе одна строка по сути. А хотя вот одна строка даже с этой "заморочкой":
Код
ThisWorkbook.SaveAs FileName:=ThisWorkbook.Path & "\" & Replace(ThisWorkbook.Name, ".xlsx", ".csv"), FileFormat:=xlUnicodeText
Чисто гипотетически попробую сегодня его вариант до ума довести — но с учётом того, что я просто для примера прикрепил файл с 3-мя спецсимволами, а файлы, которые нам нужно пересохранять в csv намного больше и сложнее — вряд ли удастся уложиться в пару строк. Думается, использовать идею kalbasiatka имеет смысл если только само решение качественнее так сказать, лучше — объясните чем, пожалуйста, если это так.
Изменено: Halloween - 02.12.2015 15:48:07
Страницы: 1
Читают тему
Наверх