Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA UTF-8 ohne BOM speichern

VBA UTF-8 ohne BOM speichern
10.03.2020 11:20:17
Nico
Hallo,
ich versuche verzweifelt seit mehreren Tagen eine aus Excel erstellte ANSI Datei ins UTF-8 Format ohne BOM zu konvertieren. In dem Code den ich verwende klappt die Umwandlung von ANSI nach UTF-8 Problemlos, nur wenn ich versuche das BOM zu entfernen, hab ich die Datei am Ende UCS-2 Little Endian kodiert vorliegen.
Hier der Code den ich verwende:
Public Function AnsiZuUtf8Datei(Dateipfad As String, _
Optional ByVal ohneBOM As Boolean) As Boolean
'Konvertiert eine ANSI-Text-Datei ins UTF8-Format
'verwendet Late-Binding, weswegen kein Verweis auf
'Microsoft ActiveX Data Objects X.X Library (ADO) notwendig ist
'Quelle: www.dbwiki.net oder www.dbwiki.de
Const adTypeBinary          As Long = 1
Const adTypeText            As Long = 2
Const adSaveCreateOverWrite As Long = 2
Dim objStreamUTF8           As Object   'ADODB.Stream
Dim objStreamANSI           As Object   'ADODB.Stream
Dim objStreamOhneBOM        As Object   'ADODB.Stream
Dim DateipfadohneBom        As String
DateipfadohneBom = Dateipfad & ".txtobom"
On Error Resume Next
Set objStreamANSI = CreateObject("ADODB.Stream")
Set objStreamUTF8 = CreateObject("ADODB.Stream")
'Streamobjekt Quelle öffnen, Kodierung ANSI-Text
objStreamANSI.Type = adTypeText
objStreamANSI.Charset = "windows-1252"
objStreamANSI.Open
'ANSI-Textdatei-Inhalt hereinladen
objStreamANSI.LoadFromFile Dateipfad
'Streamobjekt Ziel öffnen, Kodierung UTF8-Text
objStreamUTF8.Type = adTypeText
objStreamUTF8.Charset = "utf-8"
objStreamUTF8.Open
'Text vom Streamobjekt Quelle ins Streamobjekt Ziel kopieren
objStreamUTF8.WriteText objStreamANSI.ReadText
'ohne Byte Order Mark speichern
If ohneBOM Then
'Code zum entfernen der Steuerzeichen
'strret = Replace(strret, Chr(239) & Chr(187) & Chr(191), "", , , vbBinaryCompare)
'neues Stream-Objekt anlegen
Set objStreamOhneBOM = CreateObject("ADODB.Stream")
'öffnen
objStreamOhneBOM.Open
'als Binär-Typ auslegen
objStreamUTF8.Type = adTypeBinary
'Position hint BOM setzen
objStreamUTF8.Position = 3
'Stream ab Position kopieren
objStreamUTF8.CopyTo objStreamOhneBOM
'Stream speichern (Datei wird überschrieben)
objStreamOhneBOM.SaveToFile DateipfadohneBom, adSaveCreateOverWrite
'und schließen
objStreamOhneBOM.Close
Else
'UTF8-Text in gleiche Datei speichern (Datei wird überschrieben)
objStreamUTF8.SaveToFile Dateipfad, adSaveCreateOverWrite
End If
'Objekte schließen
objStreamUTF8.Close
objStreamANSI.Close
'Rückgabewert setzen
AnsiZuUtf8Datei = CBool(Err.Number = 0)
End Function

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: warum VBA?
10.03.2020 11:28:30
Fennek
Hallo,
da VBA schon recht alt ist, gibt es für einigen Themen (utf-8, json) neuere, besser geeignete Sprachen.
Für eine Ansi-Datei ist Powershell bestens geeignet.
mfg
(zum Testen wäre eine kleine Beisieldatei hilfreich)
AW: warum VBA?
10.03.2020 15:44:24
Nico
Hallo Fennek,
es gab da nen Python Script irgendwie nicht mehr funktioniert hat. In der Powershell kann ich auf Grund von administrativen Einstellungen nichts ausführen. Habs jetzt aber wieder hinbekommen, dass mir das Pythonscript die Konvertierung vornimmt.
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

VBA: UTF-8 ohne BOM speichern


Schritt-für-Schritt-Anleitung

Um eine ANSI-Datei in Excel ins UTF-8 Format ohne BOM zu konvertieren, kannst Du den folgenden VBA-Code verwenden. Dieser Code benötigt keine zusätzlichen Referenzen zu ActiveX Data Objects (ADO).

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (DeinDateiname)" > Einfügen > Modul.
  3. Kopiere den folgenden Code in das Modul:
Public Function AnsiZuUtf8Datei(Dateipfad As String, _
Optional ByVal ohneBOM As Boolean) As Boolean
    Const adTypeBinary          As Long = 1
    Const adTypeText            As Long = 2
    Const adSaveCreateOverWrite As Long = 2
    Dim objStreamUTF8           As Object   'ADODB.Stream
    Dim objStreamANSI           As Object   'ADODB.Stream
    Dim objStreamOhneBOM        As Object   'ADODB.Stream
    Dim DateipfadohneBom        As String
    DateipfadohneBom = Dateipfad & ".txtobom"
    On Error Resume Next
    Set objStreamANSI = CreateObject("ADODB.Stream")
    Set objStreamUTF8 = CreateObject("ADODB.Stream")
    'Streamobjekt Quelle öffnen, Kodierung ANSI-Text
    objStreamANSI.Type = adTypeText
    objStreamANSI.Charset = "windows-1252"
    objStreamANSI.Open
    'ANSI-Textdatei-Inhalt hereinladen
    objStreamANSI.LoadFromFile Dateipfad
    'Streamobjekt Ziel öffnen, Kodierung UTF8-Text
    objStreamUTF8.Type = adTypeText
    objStreamUTF8.Charset = "utf-8"
    objStreamUTF8.Open
    'Text vom Streamobjekt Quelle ins Streamobjekt Ziel kopieren
    objStreamUTF8.WriteText objStreamANSI.ReadText
    'ohne Byte Order Mark speichern
    If ohneBOM Then
        Set objStreamOhneBOM = CreateObject("ADODB.Stream")
        objStreamOhneBOM.Open
        objStreamUTF8.Type = adTypeBinary
        objStreamUTF8.Position = 3
        objStreamUTF8.CopyTo objStreamOhneBOM
        objStreamOhneBOM.SaveToFile DateipfadohneBom, adSaveCreateOverWrite
        objStreamOhneBOM.Close
    Else
        objStreamUTF8.SaveToFile Dateipfad, adSaveCreateOverWrite
    End If
    'Objekte schließen
    objStreamUTF8.Close
    objStreamANSI.Close
    AnsiZuUtf8Datei = CBool(Err.Number = 0)
End Function
  1. Ersetze Dateipfad mit dem Pfad Deiner ANSI-Datei.
  2. Führe die Funktion aus, indem Du =AnsiZuUtf8Datei("C:\DeinPfad\DeineDatei.txt", TRUE) in eine Zelle eingibst.

Häufige Fehler und Lösungen

Fehler: Datei wird als UCS-2 kodiert gespeichert
Wenn die Datei nach der Umwandlung als UCS-2 gespeichert wird, überprüfe den Code und stelle sicher, dass Du die Position des Byte Order Marks (BOM) korrekt setzt (objStreamUTF8.Position = 3) und dass der Stream als Binär-Typ (adTypeBinary) behandelt wird.

Fehler: "Datei nicht gefunden"
Vergewissere Dich, dass der angegebene Dateipfad korrekt ist und die Datei existiert. Achte auch auf die Dateiendung.


Alternative Methoden

Falls Du alternative Ansätze zur Konvertierung von ANSI zu UTF-8 ohne BOM in Betracht ziehst, kannst Du auch folgende Methoden verwenden:

  • Powershell: Eine einfache Powershell-Skripting-Lösung kann ebenfalls verwendet werden, um Dateien zu konvertieren, insbesondere wenn Du administrative Berechtigungen hast.

  • Python-Skripte: Python bietet ebenfalls robustere Möglichkeiten zur Handhabung von Textdateien und kann leicht für die Konvertierung von Formaten angepasst werden.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du die Funktion verwenden kannst. Angenommen, Du hast eine Datei Beispiel.txt im Verzeichnis C:\MeineDateien:

Sub TestKonvertierung()
    Dim result As Boolean
    result = AnsiZuUtf8Datei("C:\MeineDateien\Beispiel.txt", True)
    If result Then
        MsgBox "Die Datei wurde erfolgreich konvertiert!"
    Else
        MsgBox "Fehler bei der Konvertierung!"
    End If
End Sub

Führe das Skript aus, um die Konvertierung zu testen.


Tipps für Profis

  • Nutze Err.Clear vor dem Verarbeiten von Fehlern, um sicherzustellen, dass frühere Fehler nicht das Ergebnis beeinflussen.
  • Wenn Du regelmäßig Dateien konvertierst, erstelle ein benutzerdefiniertes Formular, um die Dateipfade einfach auszuwählen.
  • Überlege, ob Du zusätzliche Funktionen hinzufügen möchtest, um etwaige Formatierungsprobleme beim Speichern zu beheben.

FAQ: Häufige Fragen

1. Wie kann ich die Konvertierung automatisieren?
Du kannst die Funktion in ein Makro einfügen und auf einen Button auf Deinem Arbeitsblatt verlinken, um die Konvertierung mit einem Klick durchzuführen.

2. Gibt es eine Möglichkeit, die konvertierte Datei direkt in Excel zu öffnen?
Ja, Du kannst die konvertierte Datei nach dem Speichern mit Workbooks.Open öffnen.

3. Was ist der Unterschied zwischen UTF-8 mit und ohne BOM?
UTF-8 mit BOM enthält spezielle Byte-Zeichen, die den Texteditor informieren, dass die Datei UTF-8 ist. UTF-8 ohne BOM hat diese Zeichen nicht, was in manchen Anwendungen erwünscht ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige