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.
InformationsquelleAutor Niclas | 2015-04-06
Schreibe einen Kommentar