Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Print #1 , äöü UTF-8

Forumthread: VBA Print #1 , äöü UTF-8

VBA Print #1 , äöü UTF-8
19.07.2018 17:03:47
R.Wichert
Hallo,
ich habe ein 'kleines' Script um eine XML 200 Zeilen zu erzeugen. Problem sind die umlaute.
VBA BEISPIEL Script:

Sub gen_030()
Dim i As Integer, Datei
Datei = FreeFile
Open "C:\Temp\030.xml" For Output As #Datei
Print #Datei, "?xml version=""1.0"" encoding=""utf-8""?>"
Print #Datei, "Document>"
Print #Datei, "Übertrag ""Öffentlich"" />"
Print #Datei, "Component Übertrag=""003_Binärwerte"" />"
Print #Datei, "Document/>"
Close #Datei
End Sub

Ergebnis:

'?xml version="1.0" encoding="utf-8"?>
'Document>
'ݢertrag "צfentlich" />
'Component ݢertrag="003_Bin峷erte" />
'Document/>
Einer eine Ideen warum er das nicht so in die Datei reinkopiert?
-> Die Öffnen '
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Archiv
19.07.2018 17:17:51
Fennek
Hallo,
im Code wird UTF-8 für die xml-Datei eingestellt, nicht für das Schreiben in die Datei.
Im Archiv habe ich diese 2 Varianten gefunden:

Set fsT = CreateObject("ADODB.Stream")
fsT.Type = 2                'Stream-Typ: Text/String
fsT.Charset = "utf-8"       'Zeichensatz
fsT.Open                    'Stream öffnen
fsT.WriteText tmpStr        'Daten schreiben
fsT.SaveToFile sFilename, 2 'Datei speichern
Set fsT = Nothing
Option Private Module
Option Explicit
Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cbMultiByte As Long, _
ByVal lpDefaultChar As Long, _
ByVal lpUsedDefaultChar As Long) As  _
Long
Sub UTF8Output(Datei As String, t As String, Optional BOM As Boolean = False)
Dim tmp() As Byte, l As Long, FF As Integer
If Len(Datei) = 0 Or Len(t) = 0 Then Exit Sub
l = WideCharToMultiByte(65001, 0, _
StrPtr(t), Len(t), 0, 0, 0, 0)
Redim tmp(0 To l - 1)
WideCharToMultiByte 65001, 0, StrPtr(t), Len(t), _
VarPtr(tmp(0)), l, 0, 0
FF = FreeFile
Open Datei For Output As #FF
Close #FF
FF = FreeFile
Open Datei For Binary As #FF
Put #FF, , tmp
Close #FF
End Sub
Berichte bitte über Erfolg bzw Probleme.
mfg
Anzeige
AW: Archiv
19.07.2018 17:24:44
R.Wichert
Folgendes ist variante 1:
Set fsT = CreateObject("ADODB.Stream")
fsT.Type = 2                'Stream-Typ: Text/String
fsT.Charset = "utf-8"       'Zeichensatz
fsT.Open                    'Stream öffnen
fsT.WriteText tmpStr        'Daten schreiben
fsT.SaveToFile sFilename, 2 'Datei speichern
Set fsT = Nothing
Richtig?
Anzeige
AW: Archiv
19.07.2018 17:30:00
R.Wichert
Hi,
habe versucht

fsT.WriteText tmpStr        'Daten schreiben
durch

fsT.WriteLine "DasIst ä Töxt" 'Daten schreiben

zu ersetz -> Objekt unterstütz die Methode nicht :S
AW: getestet
19.07.2018 17:51:46
Fennek

Sub T_1()
tmpStr = "qweüöä" & vbCrLf & "ASDLÖÄ"
sFilename = "c:\temp\ADO_Test.txt"
Set fsT = CreateObject("ADODB.Stream")
fsT.Type = 2                'Stream-Typ: Text/String
fsT.Charset = "utf-8"       'Zeichensatz
fsT.Open                    'Stream öffnen
fsT.WriteText tmpStr        'Daten schreiben
fsT.SaveToFile sFilename, 2 'Datei speichern
Set fsT = Nothing
End Sub

Anzeige
AW: getestet
20.07.2018 07:41:51
R.Wichert
Danke Funktioniert.
AW: getestet
20.07.2018 07:54:39
R.Wichert
Hi,
noch eine kleine frage. ich habe mehrere Sub Module die jeweils etwas an die Datei anhängen. Das geht nicht mit ADODB oder?
Gruß und Danke Rob
AW: getestet
20.07.2018 08:22:50
R.Wichert
Erledigt ich muss "ByVal" das objekt übergeben.
Danke
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA und UTF-8: Umlaute korrekt drucken


Schritt-für-Schritt-Anleitung

Um Umlaute in einer XML-Datei mit VBA korrekt zu drucken, gehe folgendermaßen vor:

  1. Erstelle ein neues Modul in deinem Excel VBA-Editor.

  2. Füge den folgenden Code ein, um eine XML-Datei mit UTF-8-Encoding zu generieren:

    Sub gen_030()
       Dim i As Integer, Datei
       Datei = FreeFile
       Open "C:\Temp\030.xml" For Output As #Datei
       Print #Datei, "?xml version=""1.0"" encoding=""utf-8""?>"
       Print #Datei, "Document>"
       Print #Datei, "Übertrag ""Öffentlich"" />"
       Print #Datei, "Component Übertrag=""003_Binärwerte"" />"
       Print #Datei, "Document/>"
       Close #Datei
    End Sub
  3. Führe das Makro aus, um die Datei zu erstellen und überprüfe die Ausgabe auf korrekte Umlaute.


Häufige Fehler und Lösungen

  • Fehler: Umlaute werden nicht korrekt dargestellt.

    • Lösung: Stelle sicher, dass du Charset auf "utf-8" setzt, bevor du die Datei schreibst. Verwende den ADODB.Stream, um die Kodierung korrekt zu setzen.
  • Fehler: "Methode nicht unterstützt".

    • Lösung: Wenn du WriteLine anstelle von WriteText verwendest, stelle sicher, dass du die richtige Methode für den ADODB.Stream nutzt.

Alternative Methoden

Eine alternative Methode zur Erstellung von UTF-8-kodierten Dateien in VBA ist die Verwendung des ADODB.Stream-Objekts:

Sub CreateUTF8File()
    Dim fsT As Object
    Set fsT = CreateObject("ADODB.Stream")
    fsT.Type = 2                ' Stream-Typ: Text/String
    fsT.Charset = "utf-8"       ' Zeichensatz
    fsT.Open                    ' Stream öffnen

    Dim tmpStr As String
    tmpStr = "Das ist äöü"

    fsT.WriteText tmpStr        ' Daten schreiben
    fsT.SaveToFile "C:\Temp\UTF8_Test.txt", 2 ' Datei speichern
    Set fsT = Nothing
End Sub

Praktische Beispiele

Hier ist ein einfaches Beispiel für die Verwendung von WideCharToMultiByte, um UTF-8 kodierte Dateien zu erstellen:

Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As Long, _
    ByVal cbMultiByte As Long, _
    ByVal lpDefaultChar As Long, _
    ByVal lpUsedDefaultChar As Long) As Long

Sub UTF8Output(Filepath As String, text As String)
    Dim tmp() As Byte, l As Long, FF As Integer
    l = WideCharToMultiByte(65001, 0, StrPtr(text), Len(text), 0, 0, 0, 0)
    ReDim tmp(0 To l - 1)
    WideCharToMultiByte 65001, 0, StrPtr(text), Len(text), VarPtr(tmp(0)), l, 0, 0

    FF = FreeFile
    Open Filepath For Binary As #FF
    Put #FF, , tmp
    Close #FF
End Sub

Tipps für Profis

  • Verwende immer ADODB.Stream für die Verarbeitung von Textdateien mit UTF-8, um die besten Ergebnisse zu erzielen.
  • Achte darauf, die Datei im Binärmodus zu öffnen, wenn du mit WideCharToMultiByte arbeitest, um die korrekten Bytes zu schreiben.
  • Halte deinen Code modular, um die Wiederverwendbarkeit zu erhöhen und die Wartung zu erleichtern.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass meine Datei die richtige Kodierung hat?
Überprüfe nach dem Speichern, ob die Datei in einem Texteditor mit UTF-8-Unterstützung korrekt angezeigt wird.

2. Was ist der Unterschied zwischen WriteText und WriteLine?
WriteText schreibt den Text ohne Zeilenumbruch, während WriteLine einen Zeilenumbruch am Ende hinzufügt. Achte darauf, die passende Methode für deinen Anwendungsfall zu wählen.

3. Kann ich die ADODB.Stream-Methode für mehrere Module verwenden?
Ja, du kannst das ADODB.Stream-Objekt in verschiedenen Subroutinen verwenden, achte jedoch darauf, dass du die Instanz korrekt übergibst, wenn du mehrere Module hast.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige