РЕДАКТИРОВАТЬ:
Основываясь на вашем комментарии, я понимаю, что вы изначально хотели сохранить информацию о кодировке символов внутри файла без BOM .
Проблема с этим вопросом (как вы это поняли) заключается в том, что спецификация - это фактически то, что обычно содержит информацию о кодировке символов, и размещение этой информации где-либо еще в файле на самом деле не имеет смысла.
Итак, ваш код действительно идеально подходит для решения поставленной задачи. Что необходимо изменить, так это то, как файл CSV импортируется / открывается программным обеспечением, которое вы хотите использовать.
Если файл не имеет спецификации, программа, читающая файл, должна угадать кодировка символов.
В общем, если используемое вами программное обеспечение не поддерживает спецификации и неправильно угадывает, должен быть, по крайней мере, способ настроить поведение импорта / команда open, чтобы вы могли указать кодировку символов (похоже, вы ее нашли).
Исходный ответ:
По какой-то причине Excel с трудом угадайте кодировку символов при открытии файла CSV в кодировке UTF-8, просто дважды щелкнув файл. Вы должны немного помочь ему ...
Вместо того, чтобы открывать его напрямую, вы можете загрузить содержимое CSV в новую книгу, используя (устаревший) Мастер импорта текста и выбрав Набор символов UTF-8 (65001) во время импорта, если Excel не может определить это самостоятельно.
Если бы вы записали макрос во время его выполнения и превратили его в подпроцедуру, у вас могло бы быть что-то например:
Sub OpenCSV(FullFileName As String)
Dim wb As Workbook
Set wb = Workbooks.Add
Dim ws As Worksheet
Set ws = wb.Sheets(1)
With ws.QueryTables.Add(Connection:= _
"TEXT;" & FullFileName, Destination:=Range( _
"$A$1"))
.Name = "CSV_Open"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub
Другое предложение
Если вы действительно хотите иметь возможность дважды щелкнуть файл вместо использования мастера импорта текста или запуска макроса , вы всегда можете создать процедуру события VBA в надстройке или PERSONAL.XSLB, запускаемую каждый раз при открытии книги.
Если он обнаруживает, что только что открытый файл является файлом CSV, он может закрыть его и «повторно открыть», используя приведенный выше код.
Дополнительно: Интересно: есть вопрос здесь о том, как изменить кодировку символов по умолчанию, которую использует Excel .