Функция VBA для преобразования .csv в UTF-8 без спецификации - PullRequest
0 голосов
/ 23 января 2019

Я сделал макрос, который генерирует CSV-файл с данными из листа Excel.Когда я нажимаю на кнопку, этот CSV-файл отправляется на сервер и используется через несколько минут.

Он отлично работает.

Единственная проблема заключается в том, что этот CSV-файл создается в UTF-8 с BOM, и я не хочу этого, мне нужен UTF-8 без BOM

Меня вдохновила эта функция, которую я нашел просто и легко читать: Используйте «ADODB.Stream» для преобразованияANSI в UTF-8, пропустить 1-2 символа в первом ряду

Я пытался адаптировать его к этому:

Function ConvertToUtf8(myFileIn, myFileOut)

    Dim stream, strText
    Set stream = CreateObject("ADODB.Stream")

    stream.Type = 2 'text
    stream.Charset = "_autodetect_all"
    stream.Open
    stream.LoadFromFile myFileIn
    strText = stream.ReadText
    stream.Close

    stream.Type = 2
    stream.Charset = "utf-8"
    stream.Open
    stream.Position = 3 'without BOM (doesn't work)
    stream.WriteText strText
    stream.SaveToFile myFileOut, 2
    stream.Close
    Set stream = Nothing

End Function

Я не знаю почему, но это создаетфайл в UTF-8 без спецификации, но появляется эта ошибка:

(https://imgur.com/a/FhJDAzh)

Я почти уверен, что не далеко от решения, но я не нахожуэто

Когда я нажимаю «отладка», появляется эта строка:

stream.Position = 3 'without BOM (doesn't work)

РЕДАКТИРОВАТЬ

Наконец я нашел именно то, что я былвместо функции, которая преобразует файл, ищем более эффективную функцию для записи непосредственно в UTF-8 без спецификации в файле:

Function WriteUTF8WithoutBOM(chaine As String, nomfichier As String)
Dim UTFStream As Object, BinaryStream As Object
With CreateObject("adodb.stream")
    .Type = 2
    .Mode = 3
    .Charset = "UTF-8"
    .LineSeparator = -1
    .Open
    .WriteText chaine, 1
    .Position = 3 'skip BOM
   Set BinaryStream = CreateObject("adodb.stream")
        BinaryStream.Type = 1
        BinaryStream.Mode = 3
        BinaryStream.Open
    'Strips BOM (first 3 bytes)
    .CopyTo BinaryStream
    .Flush
    .Close
End With
        BinaryStream.SaveToFile nomfichier, 2
        BinaryStream.Flush
        BinaryStream.Close
End Function

Для кредита,Я нашел это здесь https://www.excel -downloads.com / threads / вопрос-преобразование-en-utf-8-pour-une-vba-qui-enregistre-un-txt.20011510 / (Staple1600ответить)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...