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

VBA Read Text File in Excel — Line Input vs Input #, und die EOF-Schleife, die keine Zeilen verliert

|

VBA Read Text File in Excel — Line Input vs Input #, und die EOF-Schleife, die keine Zeilen verliert

TL;DR — Eine Textdatei zu lesen hat drei Werkzeuge. Line Input # liest eine rohe Zeile in eine Zeichenfolge (Sie zerlegen sie selbst). Input # parst abgegrenzte Felder direkt in Variablen (nur sicher bei Dateien, die Write # erzeugt hat). Input(LOF(f), #f) liest die ganze Datei auf einmal. Schleifen Sie mit Do Until EOF(f) — prüfen Sie EOF vor jedem Lesen, sonst laufen Sie über das Ende hinaus und treffen error 62.

Dim n As Integer, line As String
n = FreeFile
Open "C:\data.txt" For Input As #n
Do Until EOF(n)                 ' VOR dem Lesen auf Ende pruefen
    Line Input #n, line         ' eine rohe Zeile in eine Zeichenfolge
    Debug.Print line
Loop
Close #n

Sobald eine Datei auf einem Kanal offen ist, sieht das Zurücklesen trivial aus — bis die Spalten durcheinander herauskommen oder die Schleife die letzte Zeile fallen lässt. Beide Probleme rühren daher, den falschen Leser zu wählen. VBA gibt Ihnen drei, und sie sind nicht austauschbar: einer reicht Ihnen die rohe Zeile, einer versucht, sie für Sie zu parsen, und einer liest alles auf einmal. Das Handwerk besteht darin, den Leser darauf abzustimmen, wie die Datei geschrieben wurde — und zu wissen, dass Input # und Write # ein zusammengehöriges Paar sind, ebenso wie Line Input # und Print #.

Was Sie lernen

  • Das mentale Modell — drei Leser, und die falsche Wahl bringt Ihre Daten durcheinander
  • Line Input # — die rohe Zeile, die Sie selbst zerlegen (der sichere Standard)
  • Input # — der Parser, der der Zwilling von Write # ist (und sich an einfacher CSV verschluckt)
  • Die Do Until EOF()-Schleife und der Off-by-one, der error 62 auslöst
  • Input(LOF(f), #f) — die ganze Datei in eine Zeichenfolge lesen
  • Wann eine CSV besser als Arbeitsmappe geöffnet wird, als sie von Hand zu parsen

Das mentale Modell: drei Leser, einer, der zu Ihrer Datei passt

Die Einsicht, die die meisten Lese-Bugs verhindert: der Leser muss dazu passen, wie die Datei geschrieben wurde.

  • Line Input # liest eine Zeile als rohe Zeichenfolge, Zeilenumbruch entfernt. Es parst nicht — Sie entscheiden, wie Sie sie zerlegen. Vorhersehbar, und es fehlinterpretiert Ihre Daten nie.
  • Input # liest eine geparste Liste von Werten direkt in Variablen, mit denselben Anführungszeichen-und-Kommas-Regeln, die Write # schreibt. Es ist der genaue Zwilling von Write #.
  • Input(LOF(f), #f) (die Funktion, nicht die Anweisung) liest die gesamte Datei in einem Aufruf in eine einzige Zeichenfolge.

So ergibt sich die Paarungsregel sofort: eine mit Write # geschriebene Datei wird mit Input # gelesen; eine mit Print # (oder von irgendeinem anderen Programm) geschriebene Datei wird mit Line Input # gelesen und von Ihnen zerlegt. Kreuzen Sie die Paare — füttern Sie eine einfache CSV an Input # —, und die Felder landen in den falschen Variablen.

Line Input #: die rohe Zeile, die Sie selbst zerlegen

Line Input # ist das Arbeitspferd und der sichere Standard. Es liest genau eine Zeile in eine Zeichenfolge, und was Sie als Nächstes tun, liegt bei Ihnen:

Dim parts() As String
Line Input #n, line
parts = Split(line, ",")        ' SIE waehlen das Trennzeichen

Weil es nie parst, rät es nie falsch. Das eine, worauf man achten muss, ist, dass ein naives Split(line, ",") auch Kommas zerlegt, die innerhalb eines gequoteten Feldes sitzen ("Rome, Italy" wird zu zwei Teilen). Wenn Ihre Daten gequotete Kommas haben, parsen Sie entweder die Anführungszeichen richtig oder — gewöhnlich einfacher — lassen Sie es Excel tun, wie unten beschrieben.

Input #: der Zwilling von Write # (und warum es eine einfache CSV zerstört)

Input # liest geparste Werte direkt in typisierte Variablen:

Dim name As String, city As String, age As Long
Input #n, name, city, age       ' erwartet "Ann","Rome",42  (Write #-Format)

Bei einer Datei, die Write # erzeugt hat, ist das perfekt und schnell — die Anführungszeichen sagen Input #, wo jede Zeichenfolge beginnt und endet. Bei einer einfachen CSV (Ann,Rome,42) funktioniert es meist noch, aber es bricht in dem Augenblick, in dem ein Feld ein nicht gequotetes Komma, einen Apostroph oder ein verirrtes Anführungszeichen enthält: Felder verschieben sich, ein " beginnt eine Zeichenfolge, die nie schließt, und der Rest der Zeile landet in den falschen Variablen. Deshalb ist Input # nur bei Dateien sicher, die von Write # geschrieben wurden. Für alles andere ist Line Input # plus Ihr eigenes Zerlegen die ehrliche Wahl.

Die EOF-Schleife und der Off-by-one, der error 62 auslöst

Sie wissen nicht, wie viele Zeilen eine Datei hat, also lesen Sie bis zum Ende — und der Ende-Test ist der Ort, an dem der klassische Bug wohnt. Prüfen Sie EOF vor jedem Lesen:

Do Until EOF(n)          ' korrekt: pruefen, DANN lesen
    Line Input #n, line
    ' ... Zeile verarbeiten ...
Loop

Die kaputte Gestalt liest zuerst und prüft später, sodass sie einen Lesevorgang über die letzte Zeile hinaus versucht und error 62 Input past end of file auslöst:

Do While Not EOF(n)
    ' ... verarbeiten ...
    Line Input #n, line   ' im letzten Durchlauf liest dies ueber das Ende hinaus -> error 62
Loop

EOF(n) liefert True, sobald die letzte Zeile gelesen wurde. Setzen Sie die EOF-Prüfung an den Anfang der Schleife, damit sie vor dem Lesevorgang auslöst, der überlaufen würde. Diese eine Anordnung behebt den Bug „meine Schleife lässt die letzte Zeile fallen oder verdoppelt sie“.

Input(LOF(f), #f): die ganze Datei auf einmal lesen

Wenn Sie die gesamte Datei als eine Zeichenfolge wollen — um sie zu durchsuchen, etwas zu zählen oder sie an einen Parser zu übergeben —, lesen Sie sie in einem einzigen Aufruf:

Dim whole As String
whole = Input(LOF(n), #n)        ' LOF(n) = Laenge der Datei in Bytes

LOF liefert die Länge der Datei, und Input(length, #n) liest so viele Zeichen. Es ist die schnellste Art, eine kleine bis mittlere Datei zu laden, um den Preis, das Ganze im Speicher zu halten — in Ordnung für ein paar Megabyte, verschwenderisch für ein riesiges Protokoll, das Sie nur Zeile für Zeile durchsuchen müssen. Dafür bleiben Sie bei der Line Input #-Schleife.

Wann man das Parsen überspringt und stattdessen die Arbeitsmappe öffnet

Wenn die Datei wirklich eine Tabelle ist — eine .csv, die Sie als Zeilen und Spalten wollen, mit korrekt behandelten gequoteten Kommas —, ist das Text-von-Hand-Parsen der harte Weg. Workbooks.Open liest eine CSV in ein echtes Blatt, behandelt die Anführungszeichen-Regeln für Sie und lässt Sie Cells(r, c) direkt lesen:

Dim wb As Workbook
Set wb = Workbooks.Open("C:\data.csv")   ' Excel parst die CSV fuer Sie

Behalten Sie die eingebauten Textleser für echte Textarbeit vor — Protokolle, Dateien mit fester Breite, Konfigurationen oder VBA-zu-VBA-Rundläufe mit Write #/Input #. Für tabellarische Daten, die für Zellen bestimmt sind, ist das Öffnen der Arbeitsmappe einfacher und korrekter. Beachten Sie, dass das eingebaute Lesen ANSI ist, sodass eine UTF-8-Datei mit akzentuierten Zeichen ADODB.Stream oder das FileSystemObject braucht, um korrekt gelesen zu werden.

Das ehrliche Fazit: Line Input als Standard, Input # nur für Write #-Dateien

Drei Leser, und die Wahl geht nicht um Geschwindigkeit — es geht darum, zum Schreiber zu passen:

  • Line Input # ist der Standard → es reicht Ihnen die rohe Zeile und liest nie falsch; Sie zerlegen sie, also bleiben Sie in Kontrolle.
  • Input # nur für Write #-Dateien → es ist der Zwilling von Write # und gerät bei einer einfachen CSV mit nicht gequoteten Kommas oder verirrten Anführungszeichen durcheinander.
  • Prüfen Sie EOF am Anfang der Schleife → zuerst-lesen-dann-prüfen läuft über die letzte Zeile hinaus und löst error 62 aus.
  • Tabellarische Daten → öffnen Sie die Arbeitsmappe → lassen Sie Excel die CSV-Anführungszeichen behandeln, statt sie von Hand zu parsen.

Das klarste Zeichen, dass Sie den falschen Leser gewählt haben, sind Spalten, die in den falschen Variablen landen. Wenn das passiert, haben Sie Input # eine Datei gefüttert, die es nicht geschrieben hat; wechseln Sie zu Line Input # und zerlegen Sie sie selbst.

Wie ExcelMaster hilft

Eine Datei zurückzulesen heißt, den Leser auf den Schreiber abzustimmen — Input # für Write #-Dateien, Line Input # für alles andere —, die EOF-Prüfung vor das Lesen zu setzen, damit die letzte Zeile nicht verloren geht, und zu wissen, wann das Öffnen der CSV als Arbeitsmappe das Text-von-Hand-Parsen schlägt. Das ist eine Menge Urteilsvermögen für „eine Datei lesen“.

ExcelMaster schreibt den Leser, der zu Ihrer Datei passt. Beschreiben Sie den Job — „importiere dieses Protokoll in ein Blatt“ oder „lies jede Zeile und ziehe die Fehlerzeilen heraus“ — und es erzeugt die Do Until EOF-Schleife mit Line Input #, das korrekte Zerlegen und ein Close, oder öffnet die CSV als Arbeitsmappe, wenn das der sauberere Weg ist — verankert an ThisWorkbook.Path. Sie beschreiben die Daten, die Sie brauchen; es schreibt den Code, der jede Zeile genau einmal liest.

Häufig gestellte Fragen

Wie lese ich in VBA eine Textdatei Zeile für Zeile?

Öffnen Sie sie For Input, dann schleifen Sie mit Do Until EOF(n) und Line Input #n, line, um bei jedem Durchlauf eine rohe Zeile zu lesen, und Close #n, wenn Sie fertig sind. Nehmen Sie die Kanalnummer aus FreeFile. Setzen Sie die EOF-Prüfung an den Anfang der Schleife, vor das Lesen, damit die Schleife keinen Lesevorgang über die letzte Zeile hinaus versucht und error 62 auslöst.

Was ist der Unterschied zwischen Line Input # und Input # in VBA?

Line Input # liest eine rohe Zeile in eine Zeichenfolge und überlässt Ihnen das Parsen, sodass es Ihre Daten nie falsch liest. Input # parst abgegrenzte Felder direkt in Variablen mit den Anführungszeichen-und-Kommas-Regeln, die Write # schreibt, sodass es nur bei Dateien verlässlich ist, die Write # erzeugt hat. Für eine einfache CSV verwenden Sie Line Input # und zerlegen die Zeile selbst.

Warum überspringt oder verdoppelt meine VBA-Leseschleife die letzte Zeile?

Weil die EOF-Prüfung an der falschen Stelle ist. Wenn Sie zuerst lesen und EOF danach prüfen, läuft die Schleife entweder über die letzte Zeile hinaus — und löst error 62 Input past end of file aus — oder behandelt sie falsch. Verwenden Sie Do Until EOF(n) am Anfang der Schleife, damit der Ende-der-Datei-Test vor jedem Line Input # läuft.

Wie lese ich in VBA eine ganze Textdatei in eine Zeichenfolge?

Verwenden Sie die Input-Funktion mit LOF: whole = Input(LOF(n), #n), nachdem Sie die Datei For Input geöffnet haben. LOF liefert die Dateilänge in Bytes und Input(length, #n) liest so viele Zeichen in einem Aufruf. Es ist die schnellste Art, eine kleine bis mittlere Datei zu laden, aber es hält die gesamte Datei im Speicher, verwenden Sie also für sehr große Dateien die Line Input #-Schleife.

Wie lese ich in VBA eine CSV-Datei?

Wenn die CSV tabellarische Daten sind, die für Zellen bestimmt sind, ist der einfachste korrekte Weg Workbooks.Open, das die Anführungszeichen-Regeln parst und Ihnen ein echtes Blatt gibt, das Sie mit Cells(r, c) lesen können. Wenn Sie den Text direkt parsen müssen, verwenden Sie Line Input # und zerlegen jede Zeile, wobei Sie gequotete Kommas selbst behandeln — und greifen Sie zu ADODB.Stream oder dem FileSystemObject, wenn die Datei UTF-8 ist, da das eingebaute Lesen ANSI ist.

Getestet in

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

Verwandte Anleitungen: VBA FreeFile & Open · VBA Print # vs Write # · VBA Open Workbook · VBA FileSystemObject · VBA Dir