🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Print # vs Write # in Excel — eine Textdatei oder CSV schreiben (und warum Ihre voller Anführungszeichen ist)

|

VBA Print # vs Write # in Excel — eine Textdatei oder CSV schreiben (und warum Ihre voller Anführungszeichen ist)

TL;DRPrint # und Write # 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 von Input # zurückgelesen zu werden. Write # für eine menschenlesbare CSV zu verwenden ist der Grund, warum Ihre voller Anführungszeichen ist; verwenden Sie Print # 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 Output kürzt, während For Append anhä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 einer MsgBox erscheinen 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#, True als #TRUE# und Empty als #NULL#. Es ist ein Serialisierungsformat, entworfen, damit Input # 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:

  • ModusFor Output schreibt die Datei bei jedem Lauf von leer neu; For Append hängt ans Ende an. Ein laufendes Protokoll wie C:\Logs\run.log muss For Append geöffnet werden, sonst löscht jeder Lauf den letzten.
  • Dezimalkomma — auf einem deutschen, französischen oder spanischen System kann CStr(3.5) 3,5 erzeugen, dessen Komma mit Ihrem CSV-Trennzeichen kollidiert und eine Zahl in zwei Spalten aufspaltet. Erzwingen Sie einen Punkt mit Format(x, "0.00") oder Str(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 Sie ADODB.Stream oder das CreateTextFile(path, True, True) des FileSystemObject.

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, damit Input # 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