Möchtest Du den gesamten Artikel lesen? Und vielleicht sogar den Artikel im PDF-Format und die Beispieldateien herunterladen? Dann hole Dir den Artikel gleich hier - völlig kostenlos!
VBA bietet einige Möglichkeiten für das Erstellen, Füllen, Ändern und Auslesen von Textdateien. Mit diesen kann man zwar nicht alle Aufgaben bewältigen, aber für einfache Zwecke lohnt sich ein Blick auf diese Sammlung. Wir meinen damit Anweisungen wie Open, Close, Print, Input und einige weitere, die spannenderweise im Objektkatalog noch nicht einmal erwähnt werden. Wir werden uns in diesem Artikel eingehend mit diesen Anweisungen beschäftigen und in verschiedenen Beispielen zeigen, wie sich damit immer wiederkehrende Aufgaben wie das Schreiben oder Lesen von Textdateien leicht bewältigen lässt.
Im Artikel Dateien mit VBA-Bordmitteln verwalten (www.vbentwickler.de/453) haben wir uns angesehen, welche Elemente die Klasse FileSystem für uns bereithält.
Hier finden wir einige Anweisungen, mit denen wir Verzeichnisse erstellen und löschen, Dateien und Verzeichnisse durchlaufen und weitere Dinge erledigen können.
Die Klasse FileSystem enthält jedoch auch einige Elemente, die wir in diesem Zusammenhang gar nicht benötigen. Sie sind vielmehr für den Einsatz mit einigen Anweisungen vorgesehen, die wir nicht in der Klasse FileSystem und sogar noch nicht einmal überhaupt im Objektkatalog des VBA-Editors finden.
Dabei geht es um solche Anweisungen wie Open, Close, Write et cetera:
- Close: Schließt eine oder mehrere zuvor mit Open geöffnete Dateien.
- Get: Dient dem Binärzugriff auf Dateien und wird in diesem Artikel nicht erläutert.
- Input #: Erlaubt das Einlesen der
- Line Input #: Erlaubt das zeilenweise Einlesen von Inhalten einer Textdatei.
- Open: Öffnet eine Datei für den lesenden oder schreibenden Zugriff oder erstellt eine neue Datei für den schreibenden Zugriff.
- Print #: Schreibt Freitext in Dateien.
- Put: Dient dem Binärzugriff auf Dateien und wird in diesem Artikel nicht erläutert.
- Seek: Ruft die aktuelle Position beim Binärzugriff ab oder setzt diese. Wird in diesem Artikel nicht erläutert.
- Width: Erlaubt die Begrenzung der Zeilenlänge beim Schreiben mit Print.
- Write #: Schreibt strukturierte Daten in Dateien.
Neben diesen Anweisungen erläutern wir in diesem Artikel auch noch diese Elemente, die Teil der Klasse FileSystem sind:
- EOF: Abkürzung für End Of File. Erwartet die Angabe einer Dateinummer einer mit Open geöffneten Datei. Für diese Datei wird angegeben, ob beim Lesen das Ende der Datei erreicht wurde.
- FileLen: Gibt die Größe einer Datei oder eines Verzeichnisses (immer 0) in Bytes zurück und erwartet den Pfad zu des Elements als Parameter.
- FreeFile: Gibt eine verfügbare Dateinummer zurück, die wir mit der Open-Anweisung nutzen können, um eine Datei zu öffnen. Keine Parameter.
- Loc: Gibt die Position innerhalb einer mit Open geöffneten Datei aus.
- LOF: Abkürzung für Length Of File. Liefert die Länge einer geöffneten Datei in Bytes. Erwartet die Dateinummer als Parameter.
- Reset: Schließt alle mit Open geöffneten Dateien.
- Seek: Setzt die aktuelle Schreibposition innerhalt einer Datei oder gibt diese zurück. Der erste Parameter erwartet die Dateinummer. Wenn der zweite Parameter gesetzt ist, wird die Schreibposition an die angegebenen Position gesetzt. Ist der zweite Parameter leer, wird die Schreibposition zurückgegeben.
Öffnen oder Erstellen einer Datei mit Open
Wenn wir bestehende Datei öffnen oder eine neue Datei erstellen wollen, benötigen wir die Open-Anweisung.
Die Open-Anweisung ist nicht wie herkömmliche VBA-Anweisungen aufgebaut, die einfach aufgerufen werden und gegebenenfalls noch einen oder mehrere Parameter entgegennehmen.
Die Open-Anweisung besteht vielmehr aus mehreren Teilen, die nacheinander notiert werden müssen. Hier ist die grundlegende Syntax:
Open pathname For mode [ Access access ] [ lock ] As [ # ] filenumber [ Len = reclength ]
Wir finden hier verschiedene Bestandteile, die wir wie Pflichtparameter oder optionale Parameter angeben können:
- pathname: Pfad zu der zu erstellenden oder zu öffnenden Datei
- mode: Modus, in dem die Datei geöffnet werden soll. Hier stehen die Werte Append, Binary, Input, Output oder Random zur Verfügung.
- access: Wird beginnend mit dem Schlüsselwort Access mit einem der Werte Read, Write oder Read Write kombiniert.
- lock: Gibt an, ob und wie andere Prozesse noch auf die geöffnete Datei zugreifen können sollen. Hier gibt es die Werte Shared, Lock Read, Lock Write und Lock Read Write.
- filenumber: Enthält eine Nummer für diesen Dateizugriff, der auch von folgenden Anweisungen zum Lesen oder Schreiben der Datei verwendet werden muss. Der Wert kann von 1 bis 511 reichen. Mit der Funktion FreeFile können wir die nächste Nummer ermitteln, die in der aktuellen Session noch nicht für den Zugriff auf eine Datei verwendet wird.
- reclength: Eine Zahl, mit der die Datensatzgröße bei der Zugriffsart Random festgelegt wird.
Für einfache lesende oder schreibende Zugriff benötigen wir nicht unbedingt alle dieser Parameter.
Schließen einer Datei mit Close
Eine geöffnete oder neu erstellte Datei kann je nach Modus lesend und/oder schreibend verwendet werden.
Danach sollte sie jedoch auch wieder geschlossen werden. Das erledigt die Anweisung Close.
Diese Anweisung erwartet keinen, einen oder mehrere Parameter. Ohne Parameter schließt die Close-Anweisung alle aktuell geöffneten Dateien wieder.
Dateien werden mit der Open-Anweisung unter Angabe einer Dateinummer geöffnet. Diese können wir auch angeben, wenn wir diese Datei gezielt wieder schließen möchten.
Wenn wir mehrere Dateien geöffnet haben, können wir diese entweder durch mehrfaches Aufrufen der Close-Methode unter Angabe der jeweiligen Dateinummer wieder schließen. Wir können die Dateinummern aber auch als kommaseparierte Liste übergeben.
Hier ein Beispiel, das eine einfache Datei zum Schreiben anlegt oder öffnet:
Dim intFile As Integer intFile = FreeFile Open CurrentProject.Path & "\Test.txt" For Output As #intFile Close #intFile
Wenn wir sicher sind, dass in der aktuellen Session nur eine Datei geöffnet wird, können wir auch einen festen Zahlenwert nutzen:
Open CurrentProject.Path & "\Test.txt" For Output As #1
Close #1
Wenn wir zwei Dateien gleichzeitig benötigen, können wir zwei Mal die FreeFile-Methode nutzen und die Dateien nacheinander öffnen und wieder schließen:
Dim intFile1 As Integer Dim intFile2 As Integer intFile1 = FreeFile Open CurrentProject.Path & "\Test1.txt" For Output As #intFile1 intFile2 = FreeFile Open CurrentProject.Path & "\Test2.txt" For Output As #intFile2 Close #intFile1 Close #intFile2
Wichtig ist, dass wir den zweiten Aufruf von FreeFile erst starten, wenn die erste Datei bereits geöffnet ist. Ansonsten würde FreeFile wieder den gleichen Wert wie beim ersten Aufruf liefern, da dieser noch nicht verwendet wurde.
Wir können die beiden letzten Anweisungen auch zusammenfassen:
Close #intFile1, #intFile2
Die vorherigen Beispiele legen immer leere Textdateien an. Da wir diese nicht mit Inhalt füllen, haben diese immer eine Größe von 0 Bytes.
Alle Dateien mit Reset schließen
Die Alternative zum Schließen aller geöffneten Dateien mit der Close-Anweisung ist die Reset-Anweisung.
Einfache Textdateien schreiben
Die folgende Prozedur erstellt eine Textdatei und füllt diese mit fünf Zeilen Text.
Dabei schreiben wir zuerst den Pfad zu der zu erstellenden Datei in die Variable strDateipfad. Wir ermitteln mit der Funktion FreeFile die nächste freie Dateinummer und schreiben diese in die Variable intDateinummer. Diese verwenden wir in der Open-Anweisung, der wir als Erstes mit strDateipfad den Namen der zu erstellenden Datei übergeben.
Danach folgt der Teil For Output, der angibt, das wir in die Datei schreiben wollen. Schließlich leitet das Schlüsselwort As die Angabe der Dateinummer ein. Die Angabe des Raute-Zeichens (#) ist hier übrigens nicht verpflichtend – im Gegensatz zu den späteren Vorkommen in Zusammenhang mit den Print– und Close-Anweisungen. Der Übersichtlichkeit halber wollen wir das Raute-Zeichen jedoch konsequent überall benutzen, wo die Dateinummer zum Einsatz kommt.
Danach durchlaufen wir eine For…Next-Schleife fünf Mal und schreiben eine Zeile wie die folgende in die Stringvariable strZeile:
Dies ist der Inhalt der Zeile 1
Danach schreiben wir den Inhalt dieser Variablen mit der Print-Methode in die Datei. Dabei geben wir als ersten Parameter die Dateinummer und als zweiten Parameter den zu schreibenden Inhalt an.
Nachdem die Schleifendurchläufe abgeschlossen sind, schließen wir mit der Close-Anweisung die Datei:
Public Sub TextdateiSchreiben() Dim strDateipfad As String Dim intDateinummer As Integer Dim strPraefix As String Dim strTextinhalt As String Dim intZeile As Integer strDateipfad = CurrentProject.Path & "\Textdatei.txt" intDateinummer = FreeFile Open strDateipfad For Output As #intDateinummer For intZeile = 1 To 5 strTextinhalt = "Dies ist der Inhalt der Zeile " _ & intZeile Print #intDateinummer, strTextinhalt Next intZeile Close #intDateinummer End Sub
Das Ergebnis sieht im Texteditor wie in Bild 1 aus.
Bild 1: Die frisch erstellte Textdatei
Einfache Textdateien einlesen
Nun schauen wir uns die verschiedenen Methoden zum Lesen des Inhalts einer Textdatei an. Dazu gehören die folgenden:
- Einlesen des kompletten Inhalts einer Textdatei in eine Variable des Datentyps String
- Zeilenweises Einlesen einer Textdatei und Zusammensetzen per VBA
Einlesen einer vollständigen Textdatei
Zunächst wollen wir die im vorherigen Beispiel erstellte Textdatei wieder in eine Textvariable einlesen.
Dazu verwenden wir die folgende Prozedur. Diese weist der Variablen strDateipfad den Pfad zu der einzulesenden Datei zu. Dann prüft sie mit der Dir-Funktion, ob diese Datei überhaupt vorhanden ist. Anderenfalls würde der Versuch, darauf zuzugreifen, anschließend einen Fehler auslösen.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo