So speichern Sie eine text-Datei (CSV) mit UTF-8 ohne BOM Codierung in VBA (Excel)?
So, das war meine anfängliche Frage. Die Antwort auf meine Frage weiter unten, scheint zu sein, dass die einzige Lösung, um UTF-8 (oder UTF-8 ohne BOM) - Codierung, ist die Verwendung des ADODB.Stream-Objekt ein.
Die Antwort auf meine neue Frage in die Betreff-Zeile ist geschrieben wie ein code.
Ich Sitze hier und versuche zu Save
einem Excel-sheet als .CSV
-Datei mit einem VBA-makro.
Allerdings Frage ich mich, wenn es darauf ankommt, ob ich ADODB
/ADODB.Stream
oder nur .SaveAs
Fileformat:=xlCSV
. Ich habe versucht, es Google, und wie es scheint, ich kann nicht finden, eine Antwort, welche Methode ist die "beste". Ich würde das Komma-delimited, UTF-8, und doppelte Anführungszeichen ("") als text-identifier.
Ist es richtig, dass, wenn Sie Fileformat:=
, es ist nicht möglich SaveAs
UTF-8, da die xlCSV
nicht, dass die Kodierung? JA, das ist richtig.
Dieser code konvertieren Sie Ihre Excel-Tabelle und speichern Sie es als CSV-Datei mit UTF-8 ohne BOM Kodieren. Gefunden habe ich diesen code auf einer website, also werde ich nicht nehmen Kredit für Sie. CSV ohne BOM link
Sub CSVFileAsUTF8WithoutBOM()
Dim SrcRange As Range
Dim CurrRow As Range
Dim CurrCell As Range
Dim CurrTextStr As String
Dim ListSep As String
Dim FName As Variant
Dim UTFStream As Object
Dim BinaryStream As Object
' ask for file name and path
FName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")
' prepare UTF-8 stream
Set UTFStream = CreateObject("adodb.stream")
UTFStream.Type = adTypeText
UTFStream.Mode = adModeReadWrite
UTFStream.Charset = "UTF-8"
UTFStream.LineSeparator = adLF
UTFStream.Open
'set field separator
ListSep = ","
'set source range with data for csv file
If Selection.Cells.count > 1 Then
Set SrcRange = Selection
Else
Set SrcRange = ActiveSheet.UsedRange
End If
For Each CurrRow In SrcRange.Rows
'enclose each value with quotation marks and escape quotation marks in values
CurrTextStr = ""
For Each CurrCell In CurrRow.Cells
CurrTextStr = CurrTextStr & """" & Replace(CurrCell.Value, """", """""") & """" & ListSep
Next
'remove ListSep after the last value in line
While Right(CurrTextStr, 1) = ListSep
CurrTextStr = Left(CurrTextStr, Len(CurrTextStr) - 1)
Wend
'add line to UTFStream
UTFStream.WriteText CurrTextStr, adWriteLine
Next
'skip BOM
UTFStream.Position = 3
'copy UTFStream to BinaryStream
Set BinaryStream = CreateObject("adodb.stream")
BinaryStream.Type = adTypeBinary
BinaryStream.Mode = adModeReadWrite
BinaryStream.Open
'Strips BOM (first 3 bytes)
UTFStream.CopyTo BinaryStream
UTFStream.Flush
UTFStream.Close
'save to file
BinaryStream.SaveToFile FName, adSaveCreateOverWrite
BinaryStream.Flush
BinaryStream.Close
End Sub
- Ich schlage vor, Sie.... versuchen Sie es und sehen! Beachten Sie, dass die CSV ist nur eine text-Datei, so dass Sie könnte auch nur mit text-Datei zu schreiben Methoden.
- Dito, was @Nick.McDermaid sagte. Probieren Sie es aus. Wenn Sie laufen in Probleme, die Sie nicht beheben können, poste deinen code und was da genau Los ist & jemand springt, um Ihnen zu helfen.
- Prost Jungs 🙂 ich war nur Wundern über die vor-und Nachteile, es zu tun auf diese Weise.
- Vielleicht Bearbeiten Sie Ihre Frage und teilen Sie es in eine Frage und eine separate Antwort? Dies würde erhöhen Sie die Lesbarkeit durch eine Menge.
Du musst angemeldet sein, um einen Kommentar abzugeben.
vielen Dank für die Buchung diese Frage und auch die Lösung. Es hat mir sehr geholfen.
Ja, ich fand auch, dass SaveAs nicht speichern Sie die CSV-Datei in UTF8. In meinem Fall ist es verwendet, shift-JIS. Das adodb.stream gut für mich gearbeitet.
Allerdings bin ich mir nicht sicher, warum, aber ich hatte zu erklären, einige Konstanten (enum), die Sie im code verwendet. (Ich bin wirklich neu auf VBA so vielleicht verpasste ich etwas darüber, warum dies geschieht). Ich fügte hinzu, diese in den Anfang der Funktion, dann funktionierte es perfekt:
Bekam ich den Wert von Microsoft docs.
Wieder einmal, vielen Dank!