.CSV in UTF-8 ohne BOM aus Excel


Jemand verlangt von Ihnen eine #.csv-Datei in #UTF-8 ohne #BOM? Spricht der Suaheli? Nein – das ist ein legitimes Anliegen … (Comma Separated Values in der Datei, in der Zeichencodierung UTF-8, und ohne Signatur). Und wie lösen wir das?

Nicht ohne #VBA – leider. Es gibt beim DATEI > Speichern Unter > Tools > Weboptionen keine UTF-8 ohne BOMCodierung. Der Ansatz ist zunächst derselbe wie vorgestern beschrieben – Sie erzeugen ein Hilfstabellenblatt, das die Daten exportfertig in einer Spalte beinhaltet, die Trennzeichen und Hochkommata müssen Sie selbst hineinbasteln.

Den Export erledigt jetzt keine Excel-Funktionalität, sondern ein Codeschnipsel:

Sub Export2CSVUTF8ohneBOM()
Dim cSh As Worksheet
Dim myRow As Long
Dim UTFStream As Object
Dim BinaryStream As Object

    Set cSh = ThisWorkbook.Worksheets("Export CSV")

On Error GoTo myFault
    
    Set UTFStream = CreateObject("adodb.stream") 'Die Ausgabe erfolgt mit ADODb Stream
    UTFStream.Type = adTypeText
    UTFStream.Mode = adModeReadWrite
    UTFStream.Charset = "UTF-8"   'hier wird die Codierung vorgegeben
    UTFStream.LineSeparator = adLF
    UTFStream.Open
    For myRow = 1 To csh.Range("A1").End(xlDown).Row
        If Not IsEmpty(dSh.Range(SelCol & myRow)) Then
            UTFStream.WriteText (cSh.Cells(myRow, 1)), adWriteLine
        End If
    Next myRow

    'Ergebnis ist jetzt UTF-8 mit BOM - es gibt keine Einstellung für "ohne BOM", daher kommt jetzt der ultimative Trick    'wir erstellen einen zweiten stream
    Set BinaryStream = CreateObject("adodb.stream")
    BinaryStream.Type = adTypeBinary
    BinaryStream.Mode = adModeReadWrite
    BinaryStream.Open

    UTFStream.Position = 3 'überspringen BOM (die ersten 3 Zeichen)   
    UTFStream.CopyTo BinaryStream 'jetzt wird der ursprünglich erzeugte Stream kopiert, aber BOM fällt weg
    'den ersten Stream braucht jetzt kein Mensch mehr
    UTFStream.Flush
    UTFStream.Close

    'Ergebnis speichern
    BinaryStream.SaveToFile ThisWorkbook.Path & "\Datei_" & Format(Now, "yyyymmdd_hhnnss") & ".csv", adSaveCreateOverWrite 'Speichern unter dem hier erzeugten Dateinamen
    BinaryStream.Flush
    BinaryStream.Close
   
    Set UTFStream = Nothing
    Set BinaryStream = Nothing

    MsgBox "Export finished to file " & ThisWorkbook.Path & "\Events_" & Format(Now, "yyyymmdd_hhnnss") & ".csv", vbOKOnly, "Export"
    Set cSh = Nothing
Exit Sub

myFault:
    MsgBox Err.Number & "-" & Err.Description & vbCrLf & " when exporting row #" & myRow & "." & vbCrLf _
    & "Please correct data and try again.", vbOKOnly, "Error"
    Resume Next
End Sub
Die Microsoft ActiveX DataObjects Library muss in den Extras > Verweisen vorhanden sein, sonst wird das nichts.
Ob das wirklich richtig arbeitet sehen Sie, wenn Sie sich das Ergebnis z.B. mit Notepad++ anschauen:
XTipp UTF-8 03.png
Ich geb’s zu, das ist keine alltägliche Anforderung. Aber auch keine völlig abwegige – Tools, die Daten importieren, haben immer zwei Möglichkeiten: sie sind sehr komplex und können mit allen möglichen Formaten gut umgehen (dann sind sie teuer), oder sie geben genau vor, womit sie arbeiten wollen und können, und reagieren pikiert, wenn der Input auch nur ein bisschen anders ist als erwartet (dann sind sie weitaus kostengünstiger, und im Fall des Falles haben Sie ein bisschen Extraaufwand).
Woche beendet – angenehme Ruhetage 🙂

Über katharinakanns

Microsoft Office Master Specialist mit viel Verständnis für IHR Geschäft - ich analysiere IHRE Situation, optimiere IHRE Prozesse, automatisiere IHRE Routineaufgaben, finde IHRE Lösung, unterrichte IHRE MitarbeiterInnen, mache Vorlagen mit IHRER CI, spare IHRE Zeit und IHR Geld. Ich freue mich darauf, SIE kennenlernen zu dürfen :-)
Dieser Beitrag wurde unter Access, Excel, VBA abgelegt und mit , , , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

2 Antworten zu .CSV in UTF-8 ohne BOM aus Excel

  1. Agathe Weiler schreibt:

    Leider bekomme ich bei der Zeile
    „Set cSh = ThisWorkbook.Worksheets(„Export CSV“)“
    immer die Fehlermeldung „ThisWorkbook.Worksheets(„Export CSV“)“=

    Gefällt mir

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s