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

VBA FreeFile & die Open-Anweisung in Excel — eine Dateinummer holen, eine Textdatei öffnen (keine Arbeitsmappe)

|

VBA FreeFile & die Open-Anweisung in Excel — eine Dateinummer holen, eine Textdatei öffnen (keine Arbeitsmappe)

TL;DR — Um mit eingebautem VBA eine Textdatei zu lesen oder zu schreiben, öffnen Sie einen nummerierten Kanal: Open path For Output As #n. Die Nummer n ist ein Handle, auf das sich jedes spätere Print #n und Close #n bezieht — nehmen Sie sie aus FreeFile, hartcodieren Sie nie #1. Zwei hartcodierte #1-Dateien lösen error 55 aus, For Output kürzt eine bestehende Datei auf leer, und ein Kanal, den Sie nie mit Close schließen, bleibt gesperrt, bis Excel beendet wird.

Sub WriteReport()
    Dim n As Integer
    n = FreeFile                      ' die naechste freie Kanalnummer holen
    Open "C:\Reports\out.txt" For Output As #n
    Print #n, "Hello"                 ' jeder Schreibvorgang bezieht sich auf diese Nummer
    Close #n                          ' den Kanal immer freigeben
End Sub

Eine Textdatei in VBA zu erreichen beginnt nicht mit dem Text — es beginnt mit einer Nummer. Die Open-Anweisung bindet Ihre Datei an einen Kanal, und von da an benennt jeder Schreib-, Lese- und Schließvorgang den Kanal über seine Nummer, nicht über seinen Pfad. FreeFile gibt es, um Ihnen eine Nummer zu geben, deren Verwendung sicher ist. Bekommen Sie diese eine Idee richtig, hört die ganze eingebaute Datei-API auf, fummelig zu sein; bekommen Sie sie falsch — indem Sie die Nummer selbst wählen —, haben Sie einen Bug geschrieben, der sich erst zeigt, sobald eine zweite Datei geöffnet ist.

Was Sie lernen

  • Das mentale Modell — FreeFile gibt Ihnen eine Kanalnummer; fangen Sie sie in einer Variablen auf
  • Warum das Hartcodieren von #1 error 55 auslöst, sobald zwei Dateien geöffnet sind
  • Die drei Modi — For Output (kürzen), For Append (anhängen), For Input (lesen) — und welcher stillschweigend Daten löscht
  • Warum die Open-Anweisung nicht Workbooks.Open ist
  • Warum ein Kanal, den Sie nie mit Close schließen, die Datei sperrt, bis Excel beendet wird
  • Das On Error-Aufräummuster, das den Kanal immer freigibt

Das mentale Modell: FreeFile gibt Ihnen eine Kanalnummer

Die zentrale Einsicht ist, dass eingebautes Datei-I/O über einen Kanal arbeitet, und der Kanal wird durch eine kleine Ganzzahl identifiziert. Open ... As #n bindet Ihre Datei an die Nummer n; danach sprechen Print #n, Input #n und Close #n alle mit dieser Datei über die Nummer. Der Pfad erscheint genau einmal — im Open.

FreeFile liefert die nächste Kanalnummer, die gerade nicht in Gebrauch ist. Die Regel, über die man stolpert: speichern Sie sie, bevor Sie öffnen. Bis eine Datei tatsächlich auf dieser Nummer geöffnet ist, liefert FreeFile weiterhin denselben Wert, Sie müssen ihn also einmal auffangen und die Variable wiederverwenden:

Dim n As Integer
n = FreeFile                 ' EINMAL auffangen
Open "C:\data.txt" For Output As #n
' ... #n verwenden ...
Close #n

Stellen Sie sich FreeFile als „gib mir einen freien Kanal“ vor und n als das Ticket. Sie würden nie zwei Kunden an dieselbe Ticketnummer heften; FreeFile ist die Art, wie Sie genau das bei Dateien vermeiden.

Warum das Hartcodieren von #1 error 55 auslöst

Die alltägliche Abkürzung — Open path For Output As #1 — funktioniert in einer Demo perfekt, weil immer nur eine Datei geöffnet ist. Sie wird in dem Augenblick zum Bug, in dem eine Routine eine zweite Datei öffnet (oder eine andere Routine aufruft, die das tut), während #1 noch offen ist:

Open "a.txt" For Output As #1
Open "b.txt" For Output As #1    ' error 55 - "File already open"

error 55 bedeutet „diese Kanalnummer ist bereits in Gebrauch“. Verschachtelte Makros, ein Logger, der schreibt, während Ihre Hauptroutine ihre eigene Datei offen hat, eine Schleife, die das Schließen vergisst — sie alle kollidieren auf der hartcodierten Nummer. FreeFile beseitigt die ganze Fehlerklasse, weil es nie eine Nummer ausgibt, die vergeben ist:

Dim nA As Integer, nB As Integer
nA = FreeFile: Open "a.txt" For Output As #nA
nB = FreeFile: Open "b.txt" For Output As #nB    ' eine andere, freie Nummer

In dem Augenblick, in dem Sie ein wörtliches #1 tippen, haben Sie die Kanalnummer von Hand entschieden — genau die Entscheidung, die FreeFile für Sie zu treffen gebaut wurde.

Die drei Modi: Output kürzt, Append hängt an, Input liest

Open ... For <mode> nimmt einen von drei Modi für sequenziellen Text, und den falschen zu wählen ist die mit Abstand häufigste Art, Daten zu verlieren:

  • For Output — erstellt die Datei, wenn sie fehlt, und kürzt sie auf leer, wenn sie bereits existiert. Eine bestehende Datei For Output zu öffnen löscht ihren Inhalt, bevor Sie eine einzige Zeile schreiben. Das ist der klassische Bug „meine Protokolldatei wird ständig geleert“.
  • For Append — erstellt die Datei, wenn sie fehlt, sonst hängt es ans Ende an. Das ist es, was Sie für ein laufendes Protokoll wollen.
  • For Input — öffnet eine bestehende Datei zum Lesen; eine fehlende Datei löst error 53 File not found aus, sichern Sie sie also zuerst mit Dir ab.
Open logPath For Append As #n     ' behaelt die Historie
Open logPath For Output As #n     ' DIESELBE Datei - loescht zuerst die Historie

Die beiden Schreibmodi sehen fast identisch aus und tun einer bestehenden Datei Gegenteiliges an. Wenn eine Datei mit der Zeit wachsen soll, ist es immer For Append; For Output ist für eine Datei, die Sie bei jedem Lauf von Grund auf neu schreiben wollen.

Die Open-Anweisung ist nicht Workbooks.Open

Open ist eine Anweisung, die eine Textdatei an eine Kanalnummer bindet. Es hat nichts damit zu tun, eine Tabelle zu laden. Eine .xlsx mit Open ... For Input zu öffnen gibt Ihnen die rohen Bytes eines ZIP-Containers, keine Arbeitsmappe, aus der Sie Zellen lesen können:

Open "Book.xlsx" For Input As #n   ' rohe Bytes - KEINE nutzbare Arbeitsmappe

Um eine tatsächliche Arbeitsmappe zu laden, verwenden Sie die Methode Workbooks.Open, die ein Workbook-Objekt mit Blättern und Zellen liefert. Die Namenskollision ist eine häufige Quelle der Verwirrung: Open (die Anweisung) ist für Text-Kanäle; Workbooks.Open (die Methode) ist für Arbeitsmappen. Wenn Ihre Datei eine .csv ist, die Sie als Zeilen und Spalten wollen, ist es gewöhnlich einfacher, sie als Arbeitsmappe zu öffnen, als den Text selbst zu parsen.

Warum ein nicht geschlossener Kanal die Datei sperrt

Jedes Open muss mit einem Close gepaart sein. Ein Kanal, den Sie nie schließen, hält die Datei gesperrt — Sie können sie nicht erneut öffnen, sie mit Kill löschen oder in Excel öffnen —, bis die Arbeitsmappe oder Excel selbst beendet wird. Die Falle ist ein Fehler zwischen Open und Close: der Fehler springt an Ihrer Close-Zeile vorbei, und der Kanal leckt.

Die robuste Gestalt setzt das Close in einen Fehlerbehandler, sodass es läuft, egal ob der Schreibvorgang gelingt oder scheitert:

Sub SafeWrite(ByVal path As String, ByVal text As String)
    Dim n As Integer
    n = FreeFile
    On Error GoTo Cleanup
    Open path For Output As #n
    Print #n, text
Cleanup:
    Close #n                 ' laeuft bei Erfolg UND bei Fehler
End Sub

Close #n gibt einen Kanal frei; ein bloßes Close ohne Nummer schließt jede offene Datei auf einmal, was ein nützliches letztes Mittel ist, aber ein grobes. Siehe On Error für das vollständige Muster garantierten Aufräumens.

Das ehrliche Fazit: FreeFile, eine Variable und ein garantiertes Close

Die eingebaute Open/Close-API ist schnell und abhängigkeitsfrei — sie verlangt nur, dass Sie den Kanal respektieren. Vier Regeln decken es ab:

  • Hartcodieren Sie nie die Nummern = FreeFile einmal, dann überall #n verwenden. Ein wörtliches #1 ist ein latentes error 55.
  • Kennen Sie Ihren ModusFor Append lässt eine Datei wachsen; For Output leert sie zuerst; For Input braucht die Datei als existierend.
  • Die Anweisung ist nicht die MethodeOpen öffnet einen Textkanal; Workbooks.Open öffnet eine Arbeitsmappe.
  • Schließen Sie immer → setzen Sie Close #n in einen On Error-Behandler, damit ein Fehler mitten im Schreiben die Datei nicht gesperrt zurücklassen kann.

Die einzige Gewohnheit, die die meisten Datei-Bugs verhindert, ist die erste Zeile jeder Routine: n = FreeFile. Wählen Sie die Nummer von Hand, und Sie haben genau das Eine gewählt, das VBA bereit war, für Sie richtig zu wählen.

Wie ExcelMaster hilft

Eine Textdatei sicher zu schreiben heißt, die Kanalnummer aus FreeFile zu nehmen, statt #1 zu hartcodieren, For Append statt For Output zu wählen, wenn die Historie überleben muss, und ein Close selbst dann zu garantieren, wenn ein Schreibvorgang scheitert — drei Details um eine Anweisung, die aussieht, als sollte sie nur eine Datei öffnen.

ExcelMaster schreibt die Datei-Routine, die nicht leckt oder leert. Beschreiben Sie den Job — „hänge jeden Lauf an ein Protokoll neben der Arbeitsmappe an“ oder „exportiere diesen Bereich in eine Textdatei“ — und es erzeugt das FreeFile-Auffangen, den richtigen Modus und das garantierte Close, verankert an ThisWorkbook.Path. Sie beschreiben die Datei, die Sie wollen; es schreibt den Code, der den Kanal korrekt öffnet und ihn immer freigibt.

Häufig gestellte Fragen

Was macht FreeFile in VBA?

FreeFile liefert die nächste Datei-Kanalnummer, die gerade nicht in Gebrauch ist, sodass Sie eine Datei öffnen können, ohne eine Nummer zu raten. Fangen Sie sie in einer Variablen auf, bevor Sie die Datei öffnen — n = FreeFile: Open path For Output As #n —, weil FreeFile weiterhin denselben Wert liefert, bis eine Datei tatsächlich auf dieser Nummer geöffnet ist. FreeFile statt eines hartcodierten #1 zu verwenden verhindert error 55 File already open, wenn mehr als eine Datei gleichzeitig geöffnet ist.

Wie öffne ich in VBA eine Textdatei?

Verwenden Sie die Open-Anweisung mit einem Modus und einer Kanalnummer: Open "C:\data.txt" For Input As #n, wobei n = FreeFile. Verwenden Sie For Output zum Erstellen oder Überschreiben, For Append zum Anhängen ans Ende und For Input zum Lesen. Paaren Sie es immer mit Close #n, wenn Sie fertig sind. Beachten Sie, dass dies einen Text-Kanal öffnet; um eine Tabelle zu laden, verwenden Sie stattdessen Workbooks.Open.

Warum liefert VBA error 55 File already open?

Weil die Kanalnummer, die Sie an Open übergeben haben, bereits in Gebrauch ist — fast immer, weil der Code #1 hartcodiert und ein zweites Open sie wiederverwendet, bevor das erste geschlossen ist. Ersetzen Sie jede wörtliche Nummer durch ein n = FreeFile, aufgefangen in einer eigenen Variablen, und schließen Sie jeden Kanal mit Close #n, sobald Sie fertig sind, damit Nummern nie doppelt belegt werden.

Löscht For Output in VBA die bestehende Datei?

Ja. Eine bestehende Datei For Output zu öffnen kürzt sie auf leer, bevor Sie irgendetwas schreiben — ihr alter Inhalt ist weg. Wenn Sie den vorherigen Inhalt behalten und ergänzen wollen, öffnen Sie die Datei stattdessen For Append. For Output ist nur für Dateien, die Sie bei jedem Lauf von Grund auf neu schreiben wollen.

Was passiert, wenn ich in VBA eine Datei nicht schließe?

Die Datei bleibt auf ihrem Kanal gesperrt — Sie können sie nicht erneut öffnen, sie mit Kill löschen oder in Excel öffnen —, bis die Arbeitsmappe oder Excel beendet wird. Um ein Leck zu vermeiden, wenn ein Fehler einen Schreibvorgang unterbricht, setzen Sie Close #n in einen On Error-Aufräumabschnitt, sodass es läuft, egal ob der Schreibvorgang gelingt oder scheitert.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 25.08.2026.

Verwandte Anleitungen: VBA Print # vs Write # · VBA Read Text File · VBA Open Workbook · VBA FileSystemObject · VBA On Error