Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

txt-Datei in utf-8 ohne Bom per vba

Forumthread: txt-Datei in utf-8 ohne Bom per vba

txt-Datei in utf-8 ohne Bom per vba
30.10.2022 10:27:26
Regina
Hallo,
ich bin ganz neu in vba und möchte per Makro eine Tabelle exportieren. Das Endergebnis soll eine Trennzeichen getrennte .txt-Datei sein mit Codierung UTF-8 ohne BOM. Ich habe verschiedene Tipps in Foren ausprobiert und habe eine Lösung, die fast funktioniert, nur leider ist das Endergebnis UTF8 mit BOM. Ich trenne in zwei Schritte:
1. Export des sheets als .txt Trennzeichen getrennt (funktioniert)
2. Umwalndeln der .txt-Datei in UTF8 (funktioniert, aber ergibt UTF8 mit BOM).
Was muss ich ändern, damit UTF-8 ohne BOM herauskommt? Ich habe schon verschiedene Vorschläge zum direkten Export von UTF-8 ohne BOM gefunden (z.B. https://blog.soprani.at/2017/02/24/csv-in-utf-8-ohne-bom-aus-excel/), die beinhalten aber nie .txt Trennzeichen getrennt. Ich würde also gerne meinen ersten Schritt beibehalten und dann im zweiten etwas ändern, damit UTF-8 ohne BOM herauskommt. Was könnte ich tun? Hier der Code für Schritt 2:

Sub KonvertANSI2UTF()
'** Konvertierung einer ANSI/ASII-Datei in das UTF-8 Format
'** Dimensionierung der Variablen
Dim strTextFile As String
Dim strTextFile_Neu As String
Dim intFile As Integer
Dim sText As String
'** Pfade vorgeben für ANSI- und UTF-Datei
intFile = FreeFile
strTextFile = "C:\Users\L380\Documents\Arbeit\BSB\Phase4_Metadaten\N-3256.txt" 'Pfad der Originaldatei, welche konvertiert werden soll
strTextFile_Neu = "C:\Users\L380\Documents\Arbeit\BSB\Phase4 Metadaten_utf8\N-3256.txt" 'Pfad der neuen UTF-Datei
'** Gesamtes Originial File (ANSI) öffnen und in Varialbe sText einlesen (diese wird anschließend in die UTF-Datei geschrieben)
Open strTextFile For Input As #intFile
sText = Input$(LOF(intFile), intFile)
'** Encoding mit UTF-8, alternativ auch UTF-16 möglich
sCharSet = "utf-8"
'** Schreiben der Daten in die neue UTF-Datei
Set adodbStream = CreateObject("ADODB.Stream")
With adodbStream
.Type = 2 'Stream Typ
.Charset = sCharSet 'Oder utf-16 etc.
.Open
.WriteText sText 'Text schreiben
.SaveToFile strTextFile_Neu, 2 'binary Daten speichern
End With
End Sub
Vielen Dank für Eure Hilfe!
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: txt-Datei in utf-8 ohne Bom per vba
30.10.2022 17:49:48
Regina
Danke für den Hinweis, Herbert_Grom! Leider übersteigt der Tipp meine Fähigkeiten, ich scheitere schon am Ausprobieren:
Das vorgeschlagene Makro hier wird mir, wenn ich es in ein neues Modul kopiere, gar nicht zu Ausführen angeboten. Ich hatte bisher nur mit Makros zu tun, die mit "sub" anfangen (die wurden mir bisher immer zum Ausführen angeboten). Was muss ich tun, um eine "private function" zu starten, damit ich sehen kann, was sie tut? Oder könnte ich in dem Code immer "private function" durch "sub" ersetzen (hat zumindest auf Anhieb nicht geklappt)?
Außerdem finde ich leider in dem Code nicht die Stelle, an der ich meine eigenen Anforderungen eingeben könnte. Vermutlich müsste ich noch eine zusätzliche Reihe an Definitionen ergänzen für vFile, vDataType und vContent? Wie müsste das konkret aussehen?
Ich bin wirklich in vba (noch) ziemlich unerfahren und kann bisher leider nur (mit etwas Glück und sehr viel Mühe) Code leicht anpassen, wenn er schon alle nötigen Elemente beinhaltet... Für nähere Hinweise, wie ich mit dem vorgeschlagenen Code arbeiten könnte, wäre ich deshalb sehr dankbar.
Anzeige
AW: txt-Datei in utf-8 ohne Bom per vba
30.10.2022 17:53:15
Herbert_Grom
Hallo Regina,
das ist eine "Function", die du, mit den entsprechenden Parametern, aus deiner "Sub" heraus aufrufen musst. Über Function-Aufrufe musst du noch mal googeln.
Servus
AW: txt-Datei in utf-8 ohne Bom per vba
30.10.2022 19:41:40
Regina
Hallo Herbert_Grom,
Puh, das ist anscheinend komplizierter, als ich erhofft hatte. Was ich durch googeln verstanden habe, zusammengefasst:
Ich sollte ein sub schreiben, innerhalb dessen diese Funktion aufgerufen wird (und zwar exakt so, wie sie in der Vorlage steht). Im sub lege ich Werte fest für die Variablen vfile (= Pfad und Dateiname für die zu speichernde .txt-Datei) und vdatatype (=.txt) sowie vcontent.
vContent muss vermutlich der komplette Inhalt der fraglichen Tabelle sein (den ich am Ende Tabstopp-getrennt brauche). Also müsste ich vcontent das Ergebnis zuweisen, das ich bisher durch mein sub zum Export als .txt Tabstopp-getrennt generiert habe. Dafür brauche ich vermutlich eine zweite Funktion, die mir den Inhalt der ursprünglichen Tabelle als Variable ausgibt. Richtig? (Mir unklar: kann ich den kompletten Inhalt einer mehrzeiligen Tabelle als einen einzigen string ausgeben lassen, und das ergibt am Ende wieder eine mehrzeilige Tabelle in der .txt -Datei? Oder muss der ganze Prozess Zeile für Zeile ablaufen, sodass vcontent für jede Zeile neu festgelegt werden muss?)
Ich rufe dann die Funktion1 aus dem sub heraus auf mit einem noch zu findenden Befehl (?), die Funktion 1 greift auf die im sub festgelegten Variablen zu, dadurch auch auf die Funktion2 und sorgt dafür, dass der in Funktion 2 generierte Inhalt unter Berücksichtigung der anderen im sub festgelegten Parameter in UTF-8 ohne BOM gespeichert wird.
Ist das das Konstrukt, das sich aus dem vorgeschlagenen Code bauen ließe? Klingt nach einem ziemlichen Mammutprojekt...
Anzeige
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 09:23:45
Herbert_Grom
Hallo Regina,
da dies auch nicht mein Lieblingsgebiet ist, habe ich deine Frage mal auf "offen" gestellt, vielleicht schaut sich das mal ein UDF-Profi an. Falls du hierauf antwortest, dann klicke auch wieder auf "Frage noch offen.". Gutes Gelingen!
Servus
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 09:47:16
Regina
Guten morgen, danke für den Hinweis, den Haken hatte ich übersehen. Falls sich hier jemand findet, zu dessen Lieblingsgebiet utf-8 gehört - oder die Verwendung von Functions - ich bin für jeden Tipp dankbar!
Anzeige
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 09:55:26
ralf_b
was denn nun ? Wills du dir alles haarklein erklären lassen oder selbst recherchieren wie man functions aufruft.
...aus dem sub heraus auf mit einem noch zu findenden Befehl (?).. der befehl ist einfach der Name der function
gibt die function einen Wert zurück , fängt man ihn in einer Variable auf. z.b. var1 = functionname(parameter1,parameter2)
Anzeige
noch offen owt
31.10.2022 09:56:55
ralf_b
AW: noch offen owt
31.10.2022 11:05:51
Regina
Ich wollte vor allem, dass vba das tut, was ich möchte - haarklein erklären war nicht mein Hauptanliegen - sorry, wenn das missverständlich war. Dass es ohne geht, ist aber um so besser. Die Lösung von Peter hat funktioniert, also ganz vielen Dank an alle Beteiligten und Helfenden!
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 09:55:42
snb
und möchte per Makro eine Tabelle exportieren. Das Endergebnis soll eine Trennzeichen getrennte .txt-Datei sein mit Codierung UTF-8 ohne BOM.
Dann zeig uns mal bitte die Tabelle.
Anzeige
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 10:22:16
peterk
Hallo
Probier mal:

Sub KonvertANSI2UTF()
'** Konvertierung einer ANSI/ASII-Datei in das UTF-8 Format
'** Dimensionierung der Variablen
Dim strTextFile As String
Dim strTextFile_Neu As String
Dim intFile As Integer
Dim sText As String
'** Pfade vorgeben für ANSI- und UTF-Datei
intFile = FreeFile
strTextFile = "C:\Users\L380\Documents\Arbeit\BSB\Phase4_Metadaten\N-3256.txt" 'Pfad der Originaldatei, welche konvertiert werden soll
strTextFile_Neu = "C:\Users\L380\Documents\Arbeit\BSB\Phase4 Metadaten_utf8\N-3256.txt" 'Pfad der neuen UTF-Datei
'** Gesamtes Originial File (ANSI) öffnen und in Varialbe sText einlesen (diese wird anschließend in die UTF-Datei geschrieben)
Open strTextFile For Input As #intFile
sText = Input$(LOF(intFile), intFile)
'** Encoding mit UTF-8, alternativ auch UTF-16 möglich
sCharSet = "utf-8"
'** Schreiben der Daten in UTF Format
Set adodbStream = CreateObject("ADODB.Stream")
With adodbStream
.Type = 2 'Stream Typ
.Charset = sCharSet 'Oder utf-16 etc.
.Open
.WriteText sText 'Text schreiben
.flush
End With
Set adodbBinStream = CreateObject("ADODB.Stream")
With adodbBinStream
.Open
.Type = 1 ' TypeBinary
End With
'Strips BOM (first 3 bytes)
adodbStream.Position = 3 'skip BOM
adodbStream.CopyTo adodbBinStream
adodbBinStream.SaveToFile strTextFile_Neu, 2 'binary Daten speichern
End Sub
Peter
Anzeige
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 11:01:09
Regina
Hallo Peter,
super, ganz ganz vielen Dank, das hat funktioniert! Tausend Dank! Das ist ja wirklich super (und sieht ganz einfach aus.... wenn man es weiß). Jetzt muss ich es nur noch in den Rest einbasteln.
Viele Grüße
Regina
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 12:18:49
snb
Hattest du schon versucht ?

Sub M_snb()
ThisWorkbook.SaveAs "G:\OF\Beispiel_UTF_8.txt", 42, , , , , , 65001
End Sub

Anzeige
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 12:33:43
Regina
Danke, snb! Der Vorschlag von Peter hat funktioniert. Offensichtlich blicke ich nicht, wie ich anzeigen kann, dass die Frage beantwortet ist...
AW: txt-Datei in utf-8 ohne Bom per vba
31.10.2022 17:47:03
snb
Du hast meine Frage noch nicht beantwortet.
;
Anzeige

Infobox / Tutorial

txt-Datei in UTF-8 ohne BOM per VBA


Schritt-für-Schritt-Anleitung

Um eine .txt-Datei mit UTF-8 Codierung ohne BOM per VBA zu erstellen, kannst du die folgenden Schritte befolgen:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.
  2. Erstelle ein neues Modul:

    • Klicke mit der rechten Maustaste auf "VBAProject (deine Arbeitsmappe)" und wähle "Einfügen" > "Modul".
  3. Füge den folgenden Code ein:

    Sub KonvertANSI2UTF()
       Dim strTextFile As String
       Dim strTextFile_Neu As String
       Dim intFile As Integer
       Dim sText As String
       Dim sCharSet As String
    
       ' Pfade für die Original- und die neue UTF-Datei
       intFile = FreeFile
       strTextFile = "C:\Pfad\zu\deiner\Datei.txt" ' Originaldatei
       strTextFile_Neu = "C:\Pfad\zu\deiner\neuen_Datei.txt" ' Neue UTF-8 Datei
    
       ' Lese die original Datei ein
       Open strTextFile For Input As #intFile
       sText = Input$(LOF(intFile), intFile)
       Close #intFile
    
       ' Setze Encoding auf UTF-8
       sCharSet = "utf-8"
    
       ' Erstelle den ADODB.Stream
       Set adodbStream = CreateObject("ADODB.Stream")
       With adodbStream
           .Type = 2 ' Stream Typ
           .Charset = sCharSet
           .Open
           .WriteText sText
           .Flush
       End With
    
       ' Erstelle einen neuen Binary Stream und speichere ohne BOM
       Set adodbBinStream = CreateObject("ADODB.Stream")
       With adodbBinStream
           .Open
           .Type = 1 ' TypeBinary
       End With
    
       ' Strips BOM
       adodbStream.Position = 3 ' skip BOM
       adodbStream.CopyTo adodbBinStream
       adodbBinStream.SaveToFile strTextFile_Neu, 2 ' Speichere die Datei
    
       ' Schließe die Streams
       adodbStream.Close
       adodbBinStream.Close
    End Sub
  4. Passe die Pfade an:

    • Ersetze die Pfade in strTextFile und strTextFile_Neu durch die tatsächlichen Pfade deiner Dateien.
  5. Führe das Makro aus:

    • Drücke F5, um das Makro auszuführen.

Häufige Fehler und Lösungen

  • Fehler: Die Datei wird als UTF-8 mit BOM gespeichert.

    • Stelle sicher, dass du die Position im Stream mit .Position = 3 korrekt setzt, um das BOM zu überspringen.
  • Fehler: Der Code lässt sich nicht ausführen.

    • Überprüfe, ob du die Funktion im richtigen Modul erstellt hast und die Syntax korrekt ist.
  • Fehler: Excel gibt eine Fehlermeldung aus.

    • Achte darauf, dass die Pfade korrekt sind und die Datei nicht von einem anderen Programm verwendet wird.

Alternative Methoden

Eine weitere Möglichkeit, eine .txt-Datei in UTF-8 ohne BOM zu erstellen, ist die Verwendung der SaveAs-Methode von Excel:

Sub ExportAsUTF8()
    ThisWorkbook.SaveAs "C:\Pfad\zu\deiner\Datei_UTF8.txt", FileFormat:=xlText, Local:=True, Encoding:=65001
End Sub

Diese Methode ist einfacher, hat jedoch einige Einschränkungen, insbesondere in Bezug auf die Formatierung.


Praktische Beispiele

Hier ist ein Beispiel, wie du eine Excel-Tabelle in eine .txt-Datei exportierst:

Sub ExportTableToTxt()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Tabelle1") ' Ersetze mit deinem Tabellennamen

    Dim strFilePath As String
    strFilePath = "C:\Pfad\zu\deiner\tabelle.txt"

    Open strFilePath For Output As #1
    For i = 1 To ws.UsedRange.Rows.Count
        For j = 1 To ws.UsedRange.Columns.Count
            If j = ws.UsedRange.Columns.Count Then
                Print #1, ws.Cells(i, j).Value
            Else
                Print #1, ws.Cells(i, j).Value & vbTab; ' Trennzeichen
            End If
        Next j
    Next i
    Close #1
End Sub

Tipps für Profis

  • Verwende ADODB.Stream für komplexere Dateiformate: Wenn du mit verschiedenen Dateiformaten arbeitest, kann ADODB.Stream dir helfen, die Codierung zu steuern.
  • Nutze FileSystemObject: Für weitere Dateimanipulationen, wie das Überprüfen, ob eine Datei existiert oder das Erstellen von Verzeichnissen.

FAQ: Häufige Fragen

1. Wie kann ich die Codierung einer bestehenden Datei ändern? Du kannst ein Makro nutzen, um die Datei zu lesen und sie dann in der gewünschten Codierung neu zu speichern, wie im Beispiel oben.

2. Was ist der Unterschied zwischen UTF-8 mit und ohne BOM? UTF-8 mit BOM enthält eine Byte-Reihenfolge-Markierung, die angibt, dass die Datei UTF-8 ist. Dies kann jedoch in einigen Programmen zu Problemen führen.

3. Wie kann ich sicherstellen, dass meine Datei richtig codiert ist? Öffne die Datei in einem Texteditor, der die Codierung anzeigen kann (wie Notepad++), um die korrekte Codierung zu überprüfen.

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