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
Inhaltsverzeichnis

per Makro UTF-8 codiert speichern

Forumthread: per Makro UTF-8 codiert speichern

per Makro UTF-8 codiert speichern
23.06.2021 18:12:40
Ingo
Hallo
Ich habe hier ein VBA-Makro. Das liest bestimmte Werte aus einer Tabelle aus und schreibt diese in eine Datei test.txt.
Diese Text-Datei ist dann in ANSI codiert. Lässt es sich mit der aktuellen Version von Excel in Office 365 auch machen, dass die Text-Date in UTF-8 codiert ist? Ich habe schon versucht, mir das anzulesen per Google-Suche. Aber so richtig werde ich daraus leider nicht schlau. Da finde ich immer nur Lösungen, die recht kompliziert zu sein scheinen.
Kann Excel nicht mit einem Makro auch so einfach UTF-8 codiert speichern, wie es ja auch über "speichern unter" geht?
Gruß
Ingo

Sub Test()
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
strPath = "E:\" 'Speicherpfad eintragen
strDateiname = "test.txt" 'Dateinamen mit Dateiendung eintragen
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
Open strPath & strDateiname For Output As #1
For i = 1 To lngZeile
If Range("spalte1").Cells(i) = "x" Then
Print #1, Cells(i, Range("spalte-a").Column).Value & vbTab & Cells(i, Range("spalte-b").Column).Value & vbTab & Cells(i, Range("spalte-c").Column).Value
Next i
Close #1
End Sub
Anzeige

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: per Makro UTF-8 codiert speichern
23.06.2021 18:48:55
Nepumuk
Hallo Ingo,
teste mal:
Code:

[Cc][+][-]

Option Explicit Public Sub Test() Const DRIVE As String = "G:\" ' Speicherpfad eintragen Const FILE As String = "test.txt" ' Dateinamen mit Dateiendung eintragen Dim lngRow As Long Dim objFileSystemObject As Object, objTextStream As Object Set objFileSystemObject = CreateObject(Class:="Scripting.FileSystemObject") Set objTextStream = objFileSystemObject.CreateTextFile( _ Filename:=DRIVE & FILE, Overwrite:=True, Unicode:=True) For lngRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Range("spalte1").Cells(lngRow).Value = "x" Then _ Call objTextStream.WriteLine( _ Cells(lngRow, Range("spalte-a").Column).Value & vbTab & _ Cells(lngRow, Range("spalte-b").Column).Value & vbTab & _ Cells(lngRow, Range("spalte-c").Column).Value) Next lngRow Call objTextStream.Close Set objTextStream = Nothing Set objFileSystemObject = Nothing End Sub

Gruß
Nepumuk
Anzeige
AW: per Makro UTF-8 codiert speichern
23.06.2021 19:18:55
Ingo
Hallo Nepumuk
Hab es gleich mal probiert. Die Text-Datei ist dann in UTF-16 LE kodiert. Kann das sein. Geht das auch als UTF-8?
Gruß
Ingo
AW: per Makro UTF-8 codiert speichern
23.06.2021 20:10:52
Nepumuk
Hallo Ingo,
teste das mal:
Code:

[Cc][+][-]

Option Explicit Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32.dll" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As LongPtr, _ ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As LongPtr, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As LongPtr, _ ByVal lpUsedDefaultChar As LongPtr) As Long Private Const CP_UTF8 As Long = 65001 Public Sub Test() Const DRIVE As String = "G:&bsol;" ' Speicherpfad eintragen Const FILE As String = "test.txt" ' Dateinamen mit Dateiendung eintragen Dim lngRow As Long Dim strText As String For lngRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Range("spalte1").Cells(lngRow).Value = "x" Then strText = strText & vbCrLf & _ Cells(lngRow, Range("spalte-a").Column).Value & vbTab & _ Cells(lngRow, Range("spalte-b").Column).Value & vbTab & _ Cells(lngRow, Range("spalte-c").Column).Value Next lngRow If Create_UTF8_File(DRIVE & FILE, Mid$(strText, 2)) Then MsgBox "OK" End Sub Private Function Create_UTF8_File(strFileName As String, strText As String) As Boolean Dim intFileNumber As Integer Dim bytBuffer() As Byte Dim lngLength As Long, lngptrPointer As LongPtr, lngSize As Long On Error GoTo error_handler lngLength = Len(strText) lngptrPointer = StrPtr(strText) lngSize = WideCharToMultiByte(CP_UTF8, 0&, _ lngptrPointer, lngLength, 0&, 0&, 0&, 0&) ReDim bytBuffer(0 To lngSize - 1) Call WideCharToMultiByte(CP_UTF8, 0&, lngptrPointer, _ lngLength, VarPtr(bytBuffer(0)), lngSize, 0&, 0&) If Dir$(strFileName) <> vbNullString Then Call Kill(strFileName) Reset intFileNumber = FreeFile Open strFileName For Binary Access Write As #intFileNumber Put #intFileNumber, , bytBuffer Close #intFileNumber Create_UTF8_File = True Exit Function error_handler: MsgBox "Fehler: " & CStr(Err.Number) & vbLf & vbLf & _ Err.Description, vbCritical, "Fehler im Modul ' 'Create_UTF8_File''" End Function

Gruß
Nepumuk
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:33:25
Ingo
Moin Nepumuk
So, ich habe das jetzt probiert. Leider gibt es eine Fehlermeldung:
Fehler im Modul 'Create UTF8 Fil'
Fehler 52
Dateiname oder -nummer falsch
Gruß
Ingo
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:39:54
Nepumuk
Hallo Ingo,
hast du das hier:

Const DRIVE As String = "G:\"    ' Speicherpfad eintragen
Const FILE As String = "test.txt"    ' Dateinamen mit Dateiendung eintragen
angepasst?
Gruß
Nepumuk
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:45:37
Ingo
Hallo Nepumuk
Ja das habe ich. Ich wollte nicht so gerne hier im Forum den echten Pfad und den echten Dateinamen zeigen.
Muss ich dann noch was an anderer Stelle im Code passend dazu anpassen. Ich hatte diesbezüglich schon geschaut, aber nichts gefunden. Vielleicht habe ich nicht gründlich genug geschaut?
Gruß
Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:56:00
Nepumuk
Hallo Ingo,
ich habe das getestet, und bei mir hat es so funktioniert. Keine Ahnung was bei dir schief läuft.
Gruß
Nepumuk
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:58:24
peterk
Hallo
Probier mal:

Sub Test()
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
Dim myTextLine As String
Dim objStream As Object
strPath = "E:\" 'Speicherpfad eintragen
strDateiname = "test.txt" 'Dateinamen mit Dateiendung eintragen
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.LineSeparator = -1  '(CRLF)
objStream.Open
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
For i = 1 To lngZeile
If Range("spalte1").Cells(i) = "x" Then
myTextLine = Cells(i, Range("spalte-a").Column).Value & vbTab & _
Cells(i, Range("spalte-b").Column).Value & vbTab & _
Cells(i, Range("spalte-c").Column).Value
objStream.writetext myTextLine, 1
End If
Next i
objStream.SaveToFile strPath & strDateiname, 1
Set objStream = Nothing
End Sub

Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 10:09:43
Ingo
Moin peterk
Vielen Dank auch Dir für Deine nette Hilfe erstmal.
Ich habe es probiert, erhalte aber eine Fehlermeldung.
Laufzeitfehler 3004
Die Datei konnte nicht beschrieben werden
Gruß
Ingo
Funktioniert wohl doch
24.06.2021 10:14:49
Ingo
Hallo nochmal
Funktioniert wohl doch. Hatte einen Tippfehler gemacht. Ich werde das jetzt nochmal genauer testen und Dich dann informieren.
Gruß
Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 10:19:39
Ingo
Hallo peterk
Ein kleines Hoppla gibt es noch.
Die Datei wird geschrieben und ist auch korrekt in UTF-8 kodiert. Soweit alles super.
Beim zweiten Ausführen des Makros kommt aber eine Fehlermeldung:
"Die Date konnte nicht beschrieben werden"
Ich nehme an, dass im Code nicht steht, dass die Datei dann einfach überschrieben werden soll. Kann das sein?
Gruß
Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 10:32:43
peterk
Hallo

objStream.SaveToFile strPath & strDateiname, 2
' 	1 	Default. Creates a new file if the file does not already exist
'       2 	Overwrites the file with the data from the currently open Stream object, if the file already exists

AW: per Makro UTF-8 codiert speichern
24.06.2021 10:48:26
Ingo
Hallo peterk
Ja ich danke Dir. Hatte es auch gerade schon ergooglen können.
Deine Lösung klappt also super. Und sie ist ja auch schon schmal.
Ganz vielen lieben Dank dafür.
Gruß
Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 13:29:27
Ingo
Hallo peterk
Aktuell wird die Text-Datei ja folgendermaßen kodiert:
UTF-8 mit BOM
Geht das auch so?
UTF-8 ohne BOM
Gruß Ingo
AW: per Makro UTF-8 codiert speichern
24.06.2021 14:00:38
peterk
Hallo Ingo
Ja, mit einem kleinen Trick
Geänderte Deklaration

Const NoBOM = True
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
Dim myTextLine As String
Dim objStream As Object
 Dim objStreamNoBOM As Object
Nach der Schleife:

If NoBOM Then
Set objStreamNoBOM = CreateObject("ADODB.Stream")
objStreamNoBOM.Type = 1 ' adTypeBinary
objStreamNoBOM.Open
objStream.Position = 3
objStream.CopyTo objStreamNoBOM
objStreamNoBOM.SaveToFile strPath & strDateiname, 2
Set objStreamNoBOM = Nothing
Else
objStream.SaveToFile strPath & strDateiname, 2
End If
Set objStream = Nothing

Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 14:30:35
Ingo
Hallo peterk
Das gibt bei mir eine Fehlermeldung:
Laufzeitfehler *-2147024809 (80070057)':
Falscher Parameter
Der VBA-Debugger markiert mir dann die folgende Zeile in gelb.
objStream.Position = 3
Ich poste hier nochmal den ganzen Code mit den von Dir genannten Änderungen.

Sub xxx()
Const NoBOM = True
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
Dim myTextLine As String
Dim objStream As Object
Dim objStreamNoBOM As Object
strPath = "C:\xxx\" 'Speicherpfad eintragen
strDateiname = "xxx.xml" 'Dateinamen mit Dateiendung eintragen
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.LineSeparator = -1  '(CRLF)
objStream.Open
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
myTextLine = myTextLine & "xxx" & vbCrLf
For i = 2 To 32
myTextLine = myTextLine & "xxx" & vbCrLf
Next i
myTextLine = myTextLine & "xxx" & vbCrLf
objStream.writetext myTextLine, 1
objStream.SaveToFile strPath & strDateiname, 2
Set objStream = Nothing
If NoBOM Then
Set objStreamNoBOM = CreateObject("ADODB.Stream")
objStreamNoBOM.Type = 1 ' adTypeBinary
objStreamNoBOM.Open
objStream.Position = 3
objStream.CopyTo objStreamNoBOM
objStreamNoBOM.SaveToFile strPath & strDateiname, 2
Set objStreamNoBOM = Nothing
Else
objStream.SaveToFile strPath & strDateiname, 2
End If
Set objStream = Nothing
End Sub
Habe ich da was falsch gemacht?
Gruß
Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 14:58:39
peterk
Hallo Ingo

Sub xxx()
Const NoBOM = True
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
Dim myTextLine As String
Dim objStream As Object
Dim objStreamNoBOM As Object
strPath = "C:\xxx\" 'Speicherpfad eintragen
strDateiname = "xxx.xml" 'Dateinamen mit Dateiendung eintragen
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.LineSeparator = -1  '(CRLF)
objStream.Open
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
myTextLine = myTextLine & "xxx" & vbCrLf
For i = 2 To 32
myTextLine = myTextLine & "xxx" & vbCrLf
Next i
myTextLine = myTextLine & "xxx" & vbCrLf
objStream.writetext myTextLine, 1
If NoBOM Then
Set objStreamNoBOM = CreateObject("ADODB.Stream")
objStreamNoBOM.Type = 1 ' adTypeBinary
objStreamNoBOM.Open
objStream.Position = 3
objStream.CopyTo objStreamNoBOM
objStreamNoBOM.SaveToFile strPath & strDateiname, 2
Set objStreamNoBOM = Nothing
Else
objStream.SaveToFile strPath & strDateiname, 2
End If
Set objStream = Nothing
End Sub

Anzeige
Pizza?
24.06.2021 15:09:06
Ingo
Hallo peterk
Ah alles klar. Jetzt sehe ich meinen Fehler. Danke Dir nochmals.
Sag mal, darf ich Dir vielleicht einen Gutschein für ne leckere Pizza-Lieferung zukommen lassen?
Gruß
Ingo
AW: Pizza?
24.06.2021 15:13:20
peterk
Hallo Ingo
Danke für das Angebot, bleib aber lieber anonym ;-)
Peter
Habe es herausbekommen (2 statt 1) o.T.
24.06.2021 10:31:46
Ingo
o.T.
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

UTF-8 Codierung in Excel mit VBA speichern


Schritt-für-Schritt-Anleitung

Um eine Textdatei mit UTF-8 Codierung in Excel über ein VBA-Makro zu speichern, folge diesen Schritten:

  1. Öffne das VBA-Editor-Fenster:

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

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

    Sub ExportToUTF8()
       Dim strPath As String, strDateiname As String
       Dim i As Long, lngZeile As Long
       Dim objStream As Object
    
       strPath = "E:\" ' Speicherpfad anpassen
       strDateiname = "test.txt" ' Dateinamen anpassen
    
       Set objStream = CreateObject("ADODB.Stream")
       objStream.Charset = "utf-8"
       objStream.LineSeparator = -1 '(CRLF)
       objStream.Open
    
       lngZeile = Range("A" & Rows.Count).End(xlUp).Row
    
       For i = 1 To lngZeile
           If Range("spalte1").Cells(i).Value = "x" Then
               myTextLine = Cells(i, Range("spalte-a").Column).Value & vbTab & _
                            Cells(i, Range("spalte-b").Column).Value & vbTab & _
                            Cells(i, Range("spalte-c").Column).Value
               objStream.writetext myTextLine, 1
           End If
       Next i
    
       objStream.SaveToFile strPath & strDateiname, 2 ' 2 = Überschreiben
       Set objStream = Nothing
    End Sub
  4. Ändere den Speicherpfad und Dateinamen:

    • Passe strPath und strDateiname an deine Bedürfnisse an.
  5. Führe das Makro aus:

    • Drücke F5 oder klicke auf „Ausführen“, um das Makro zu starten.

Häufige Fehler und Lösungen

  • Fehlermeldung: "Die Datei konnte nicht beschrieben werden":

    • Stelle sicher, dass der angegebene Speicherpfad existiert und dass der Benutzer die notwendigen Berechtigungen hat.
  • Fehler 52: "Dateiname oder -nummer falsch":

    • Überprüfe den angegebenen Dateipfad und die Dateinamenserweiterung.
  • Die Datei wird in UTF-16 anstatt in UTF-8 codiert:

    • Stelle sicher, dass die Charset-Eigenschaft korrekt auf "utf-8" gesetzt ist.

Alternative Methoden

Eine weitere Möglichkeit, eine UTF-8 Datei zu erstellen, ist die Verwendung des FileSystemObject. Hier ein Beispiel:

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim ts As Object
Set ts = fso.CreateTextFile(strPath & strDateiname, True, True) ' True für UTF-8

Verwende diese Methode, wenn du eine einfache Möglichkeit zur Erstellung von Textdateien benötigst.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie man spezifische Daten aus einer Excel-Tabelle in eine UTF-8 Textdatei exportiert:

Sub ExportData()
    Const strPath As String = "C:\DeinPfad\"
    Const strDateiname As String = "daten.txt"
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Tabelle1")

    Dim objStream As Object
    Set objStream = CreateObject("ADODB.Stream")
    objStream.Charset = "utf-8"
    objStream.Open

    Dim i As Long
    For i = 1 To ws.Cells(Rows.Count, 1).End(xlUp).Row
        objStream.WriteText ws.Cells(i, 1).Value & vbCrLf
    Next i

    objStream.SaveToFile strPath & strDateiname, 2
    objStream.Close
    Set objStream = Nothing
End Sub

Tipps für Profis

  • Zeilenumbruch: Du kannst den LineSeparator für spezielle Anforderungen anpassen, z.B. vbLf für Linux-kompatible Zeilenumbrüche.
  • BOM entfernen: Um UTF-8 ohne BOM zu speichern, kannst du die Position im Stream anpassen, um die ersten drei Bytes (BOM) zu entfernen.
objStream.Position = 3
  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung im Code, um Laufzeitfehler eleganter zu handhaben.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass meine Datei in UTF-8 gespeichert wird?
Verwende die Charset-Eigenschaft des ADODB.Stream Objekts und setze sie auf "utf-8".

2. Kann ich die Datei direkt aus einer bestimmten Excel-Tabelle exportieren?
Ja, du kannst auf eine spezifische Tabelle zugreifen, indem du den Tabellennamen im VBA-Code angibst.

3. Wie kann ich die Zeilen in der Textdatei formatieren?
Du kannst die vbTab oder vbCrLf Konstanten verwenden, um Daten in der benötigten Form zu trennen.

4. Was tun, wenn ich Fehler beim Speichern der Datei bekomme?
Überprüfe den Dateipfad, die Berechtigungen und stelle sicher, dass der Speicherort existiert. Bei Problemen mit der Codierung, kontrolliere die Charset-Einstellung.

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