TL;DR —
Print #undWrite #schreiben in gegenteiligen Stilen in eine Datei.Print #schreibt Text genau so, wie er aussieht — keine Anführungszeichen, keine Kommas, Sie fügen die Trennzeichen ein.Write #schreibt Maschinen-Format — jede Zeichenfolge in Anführungszeichen, Kommas zwischen den Werten, Datumsangaben in#...#—, gemacht, um vonInput #zurückgelesen zu werden.Write #für eine menschenlesbare CSV zu verwenden ist der Grund, warum Ihre voller Anführungszeichen ist; verwenden SiePrint #und bauen Sie die Zeile selbst.
' Write # - Maschinenformat, Anfuehrungszeichen um jede Zeichenfolge:
Write #n, "Ann", "Rome", 42 ' Datei erhaelt: "Ann","Rome",42
' Print # - Sie steuern das Layout, keine Anfuehrungszeichen:
Print #n, "Ann" & "," & "Rome" & "," & 42 ' Datei erhaelt: Ann,Rome,42
Sobald ein Makro einen Kanal öffnen kann, ist die nächste Entscheidung, wie die
Bytes auf der Festplatte aussehen sollen — und VBA gibt Ihnen zwei Anweisungen, die diese Frage auf völlig
gegenteilige Weise beantworten. Print # schreibt, was Sie sehen; Write # schreibt, was ein Programm
zurückparsen kann. Wählen Sie die falsche, und die Datei ist technisch gültig, aber nutzlos für den, der
sie als Nächstes öffnet: eine CSV, die in Anführungszeichen ertrinkt, oder eine „CSV“, deren Spalten alle
in einer Zelle stehen. Zu wissen, welche Anweisung welche Bytes erzeugt, ist das ganze Handwerk.
Was Sie lernen
- Das mentale Modell —
Print #schreibt, was Sie sehen,Write #schreibt, was ein Programm zurückliest - Warum
Write #Anführungszeichen um jede Zeichenfolge setzt (und wann das genau richtig ist) - Warum ein Komma in einer
Print #-Liste Druckzonen einfügt, keine CSV-Kommas - Wie man eine saubere CSV-Zeile mit
Print #und Ihren eigenen Trennzeichen baut - Warum
For Outputkürzt, währendFor Appendanhängt - Die Dezimalkomma-Locale-Falle, und warum das eingebaute Schreiben ANSI statt UTF-8 ist
Das mentale Modell: Anzeigeformat vs. Maschinenformat
Die Einsicht, die fast jede „warum sieht meine Datei so aus“-Frage klärt: Print # und Write # bedienen
zwei verschiedene Leser.
Print #schreibt Anzeigeformat. Es legt den Text genau so auf die Festplatte, wie er in einer Zelle oder einerMsgBoxerscheinen würde — keine Anführungszeichen, keine automatischen Trennzeichen, keine Typmarkierungen. Sie entscheiden das Layout.Write #schreibt Maschinenformat. Es wickelt jede Zeichenfolge in Anführungszeichen, trennt Werte mit Kommas, schreibt Datumsangaben als#2026-01-31#,Trueals#TRUE#undEmptyals#NULL#. Es ist ein Serialisierungsformat, entworfen, damitInput #genau dieselben Werte zurücklesen kann.
Die Wahl ist also nie eine Geschmacksfrage — es geht darum, wer die Datei als Nächstes liest. Ein
Programm, das sie mit Input # zurückparst, will Write #. Ein Mensch, Excel oder irgendein anderes
Werkzeug will Print #.
Warum Write # Ihre CSV mit Anführungszeichen füllt
Das ist die Beschwerde Nummer eins, und es ist kein Bug — es ist Write #, das seine Arbeit tut:
Write #n, "Ann", "Rome", 42
' Datei: "Ann","Rome",42
Diese Anführungszeichen sind Absicht: sie lassen Input # eine Zeichenfolge, die ein Komma enthält
("Rome, Italy"), von zwei getrennten Feldern unterscheiden. Perfekt für einen VBA-zu-VBA-Rundlauf; falsch
für einen Bericht, den ein Mensch öffnet. Wenn jemand fragt „warum ist meine exportierte CSV voller
Anführungszeichen“, ist die Antwort immer dieselbe — der Code verwendete Write #, wo er Print # wollte.
Write # ist in genau einer Situation das richtige Werkzeug: Sie haben die Datei mit Write # geschrieben
und werden sie mit Input # zurücklesen, vollständig innerhalb von VBA. Für alles, was ein Mensch oder
Excel öffnet, greifen Sie zu Print #.
Warum ein Komma in Print # kein CSV-Komma ist
Die naheliegende Abhilfe — „verwenden Sie einfach Print # mit Kommas“ — hat ihre eigene Falle, weil das
Komma in einer Print #-Liste etwas anderes bedeutet:
Print #n, "Ann", "Rome", 42 ' NICHT Ann,Rome,42
Ein Komma zwischen Elementen in einer Print #-Liste fügt eine Druckzone ein — einen Tabstopp etwa
alle 14 Zeichen, ein Überbleibsel aus dem Konsolendruck. So kommt die Zeile oben mit weiten Lücken heraus,
nicht mit Kommas, und Ihre „CSV“ öffnet sich als eine einzige verstümmelte Spalte. Die Abhilfe ist,
Print # keine Trennzeichen mehr einfügen zu lassen und die ganze Zeile selbst zu bauen:
Print #n, "Ann" & "," & "Rome" & "," & 42 ' Ann,Rome,42 - eine Zeichenfolge, die Sie steuern
Verketten Sie die Felder mit dem wörtlichen Trennzeichen, das Sie wollen, übergeben Sie Print # eine
einzige Zeichenfolge, und Sie erhalten genau diese Bytes. Ein abschließendes Semikolon
(Print #n, s;) unterdrückt den Zeilenumbruch, wenn Sie eine Zeile in Teilen zusammensetzen müssen.
Eine echte CSV-Zeile mit Print # bauen
Zusammengefügt verbindet das verlässliche „CSV schreiben“-Muster jede Zeile zu einer Zeichenfolge und lässt
Print # sie wörtlich ausgeben:
Sub ExportRange(ByVal rng As Range, ByVal path As String)
Dim n As Integer, r As Range, cell As Range, line As String
n = FreeFile
Open path For Output As #n ' kuerzt; Append verwenden zum Anhaengen
For Each r In rng.Rows
line = ""
For Each cell In r.Cells
line = line & cell.Value & "," ' Ihr Trennzeichen, Ihre Regeln
Next cell
If Len(line) > 0 Then line = Left(line, Len(line) - 1) ' abschliessendes Komma entfernen
Print #n, line ' eine vollstaendige Zeile, genau wie gebaut
Next r
Close #n
End Sub
Das ist die Gestalt, die fast jeder produktive CSV-Export annimmt, weil es die einzige Art ist,
Anführungszeichen und Trennzeichen präzise zu steuern. Wenn ein Feld selbst ein Komma enthalten kann,
umschließen Sie dieses Feld selbst mit Anführungszeichen — das ist eine Entscheidung, die Print # Ihnen
überlässt, was der Sinn der Sache ist.
Output kürzt, Append hängt an — und die Locale- und Kodierungsfallen
Zwei weitere Details entscheiden, ob die Datei korrekt ist:
- Modus —
For Outputschreibt die Datei bei jedem Lauf von leer neu;For Appendhängt ans Ende an. Ein laufendes Protokoll wieC:\Logs\run.logmussFor Appendgeöffnet werden, sonst löscht jeder Lauf den letzten. - Dezimalkomma — auf einem deutschen, französischen oder spanischen System kann
CStr(3.5)3,5erzeugen, dessen Komma mit Ihrem CSV-Trennzeichen kollidiert und eine Zahl in zwei Spalten aufspaltet. Erzwingen Sie einen Punkt mitFormat(x, "0.00")oderStr(x)(das immer.verwendet), oder umschließen Sie numerische Felder mit Anführungszeichen. - Kodierung — eingebautes
Print #schreibt ANSI, nicht UTF-8. Akzentuierter oder nicht-lateinischer Text (é,ü, 日本語) wird in der System-Codepage geschrieben und verstümmelt, wenn die Datei als UTF-8 geöffnet wird. Für Unicode-Ausgabe verwenden SieADODB.Streamoder dasCreateTextFile(path, True, True)desFileSystemObject.
Das ehrliche Fazit: wählen Sie danach, wer die Datei liest
Print # und Write # sind nicht austauschbar, und die ganze Entscheidung läuft auf eine Frage hinaus:
- Write # nur für VBA-zu-VBA-Rundläufe → seine Anführungszeichen, Kommas und
#...#-Markierungen existieren, damitInput #die exakten Werte wieder aufbauen kann. Ein Mensch sollte sie nie sehen. - Print # für alle anderen → bauen Sie jede Zeile selbst mit den Trennzeichen, die Sie wollen; ein
Komma in einer
Print #-Liste ist eine Druckzone, kein Trennzeichen. - Append zum Ansammeln, Output zum Neuschreiben → der Modus entscheidet, ob die Historie überlebt.
- Erzwingen Sie
.und gehen Sie für echte CSV auf UTF-8 → sichern Sie die Dezimalkomma-Locale-Falle und die ANSI-Kodierungsfalle ab, bevor die Datei Ihre Maschine verlässt.
Das klarste Signal, dass Sie zur falschen Anweisung gegriffen haben, sind Anführungszeichen, um die Sie
nicht gebeten haben. Wenn sie erscheinen, haben Sie mit Write # geschrieben; wechseln Sie zu Print #
und übernehmen Sie das Layout.
Wie ExcelMaster hilft
Saubere Daten zu exportieren heißt zu wissen, dass Write # für Input # alles in Anführungszeichen
wickelt, dass ein Komma in Print # eher eine Druckzone als ein Trennzeichen ist, dass For Output die
Datei leert, während For Append sie wachsen lässt, und dass ein Dezimalkomma oder eine ANSI-Kodierung eine
CSV still beschädigen kann — eine Menge Urteilsvermögen für „eine Datei schreiben“.
ExcelMaster schreibt den Export,
der sich sauber öffnet. Beschreiben Sie den Job — „speichere diesen Bereich als CSV“ oder „hänge bei jedem
Lauf eine Zeile an ein Protokoll an“ — und es erzeugt den Print #-Zeilenbauer mit den richtigen
Trennzeichen, dem korrekten Modus und Locale-sicherer Zahlenformatierung, verankert an
ThisWorkbook.Path. Sie beschreiben die Datei, die ein Mensch oder Programm lesen
muss; es schreibt den Code, der genau diese Bytes erzeugt.
Häufig gestellte Fragen
Was ist der Unterschied zwischen Print # und Write # in VBA?
Print # schreibt Text genau so, wie er erscheint — keine Anführungszeichen und keine Trennzeichen, sodass
Sie das Layout steuern. Write # schreibt maschinenlesbares Format — jede Zeichenfolge in
Anführungszeichen gewickelt, Kommas zwischen den Werten und Datumsangaben in #...# —, entworfen, um von
Input # zurückgelesen zu werden. Verwenden Sie Print # für alles, was ein Mensch oder Excel öffnet, und
Write # nur für Dateien, die Sie mit Input # wieder in VBA einlesen werden.
Warum ist meine VBA-CSV voller Anführungszeichen?
Weil der Code Write # verwendet hat, das absichtlich jede Zeichenfolge in Anführungszeichen wickelt,
damit Input # sie zurückparsen kann. Das ist richtig für einen VBA-zu-VBA-Rundlauf, aber falsch für einen
Bericht. Wechseln Sie zu Print # und bauen Sie jede Zeile selbst — Print #n, a & "," & b —, um eine
saubere CSV ohne zusätzliche Anführungszeichen zu erhalten.
Warum trennt Print # meine Werte nicht mit Kommas?
Ein Komma zwischen Elementen in einer Print #-Liste fügt eine Druckzone ein (einen Tabstopp etwa alle
14 Zeichen), kein CSV-Komma, sodass die Felder mit weiten Lücken in einer einzigen Spalte herauskommen.
Übergeben Sie Print # stattdessen eine einzige verkettete Zeichenfolge — Print #n, a & "," & b & "," & c —, damit die Trennzeichen genau die sind, die Sie geschrieben haben.
Wie schreibe ich in VBA eine Textdatei, ohne sie zu überschreiben?
Öffnen Sie sie For Append statt For Output. For Output kürzt die Datei vor dem Schreiben auf leer,
sodass jeder Lauf den vorherigen Inhalt löscht; For Append erstellt die Datei, wenn sie fehlt, und hängt
sonst ans Ende an. Nehmen Sie die Kanalnummer aus FreeFile und schließen Sie sie
mit Close #n, wenn Sie fertig sind.
Wie schreibe ich in VBA UTF-8 oder akzentuierte Zeichen in eine Datei?
Eingebautes Print # und Write # schreiben ANSI in der System-Codepage, sodass akzentuierter oder
nicht-lateinischer Text verstümmelt, wenn die Datei als UTF-8 gelesen wird. Für Unicode-Ausgabe verwenden
Sie ADODB.Stream oder das CreateTextFile(path, True, True) des
FileSystemObject, wo das letzte Argument Unicode anfordert. Erzwingen Sie
außerdem einen Dezimalpunkt mit Format(x, "0.00"), damit ein Locale-Dezimalkomma Ihre Trennzeichen nicht
zerbricht.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 25.08.2026.
Verwandte Anleitungen: VBA FreeFile & Open · VBA Read Text File · VBA FileSystemObject · VBA Save Workbook · VBA CurDir
