Einige Anwendungen erfordern die temporäre Verwaltung von Daten – d.h., die Daten werden im Programmverlauf ermittelt, für einen bestimmten Zweck verwendet und anschließend wieder gelöscht. Selbstverständlich könnte man für solche Fälle Tabellen anlegen, die Daten während der Bearbeitung darin speichern und die Tabelle anschließend wieder löschen. Das ist aber erstens aufwendig und zweitens wächst die Größe der Datenbank schnell ins Unermessliche, wenn der Anwender sie nicht regelmäßig komprimiert. Daher verwenden Sie entweder Datenfelder – sogenannte Arrays – oder die seit Access 2000 verfügbaren ungebundenen Datensatzgruppen.
Datenfelder (im Fachjargon: Arrays) dienen zum Speichern mehrerer Werte in einer einzigen Variablen. So können Sie sich – im Gegensatz zu einfachen Variablen – eine Menge Deklarationen und Wertzuweisungen speichern.
Gültigkeitsbereiche von Datenfeldern
Datenfelder haben einen Gültigkeitsbereich, der wie bei allen anderen Variablen von der Art der Deklaration abhängt. Dabei gibt es prinzipiell drei Möglichkeiten:
Statische und dynamische Datenfelder
Statische Datenfelder
Dim Monatsnamen(12) as String
Zumindest lautet die Deklaration so, wenn Sie davon ausgehen, dass die einzelnen Daten von der Zahl Eins ausgehend durchnummeriert werden. Das ist aber standardmäßig nicht der Fall: Stattdessen beginnt der Index für Datenfelder bei der Zahl Null. Und da Sie mit der Zahl 12 die obere Bereichsgrenze angegeben haben, können Sie nun theoretisch 13 Daten in das Datenfeld eingeben – von 0 bis 12.
Um die Anzahl der Elemente des Datenfeldes nun tatsächlich auf den Wert 12 festzulegen, gibt es zwei Möglichkeiten. Entweder setzen Sie die obere Grenze auf den Wert 11, wie in folgender Anweisung:
Public Monatsnamen(11) As String
Oder Sie setzen die untere Bereichsgrenze auf den Wert 1. Dazu verwenden Sie den folgenden Befehl und setzen gleichzeitig wieder die obere Grenze auf den Wert 12:
Option Base 1 Public Monatsnamen(12) As String
Auf diese Weise können Sie nun die Monatsnamen von 1 bis 12 durchnummeriert in die gewünschte Variable einlesen. Dazu verwenden Sie eine kleine Prozedur:
Sub MonatsnamenZuweisen() Monatsnamen(1) = "Januar" Monatsnamen(2) = "Februar" .... Monatsnamen(12) = "Dezember" End Sub
Wenn Sie allerdings einen Monatsnamen eingeben möchten, dessen Index außerhalb des angegebenen Bereichs liegt, erscheint eine Fehlermeldung (siehe Bild 1). Um das zu testen, geben Sie einfach im Testfenster die folgende Anweisung ein:
Monatsnamen(13) = "Fantasiemonat"
Bild 1: Fehlermeldung nach der Eingabe eines unzulässigen Feldindizes
Sie können die eingelesenen Monatsnamen nun beispielsweise mit der folgenden Anweisung ausgeben lassen:
Debug.Print Monatsnamen(1)
Oder Sie verwenden eine kleine Prozedur, um alle Monate auszugeben:
Sub MonateAusgeben() Dim i As Integer For i = 1 To 12 Debug.Print "Name des " _ & i & ".ten Monats: " _ & Monatsname(i) Next End Sub
Die Angabe der unteren Grenze mit der Option Base-Anweisung können Sie allerdings auch umgehen, falls Sie mehrere Datenfelder verwenden und nicht alle die gleiche Untergrenze haben sollen. Geben Sie dazu die Untergrenze und die Obergrenze explizit in der Deklaration des Datenfeldes an:
Public Monatsname(1 to 12) As String
Sie können die Monatsnamen auch direkt als Liste eingeben. Dazu verwenden Sie die Array-Funktion. Die Funktion arbeitet allerdings nur mit Variant-Variablen, daher müssen Sie zuvor eine entsprechende Variable deklarieren:
Public Monatsname As Variant
Anschließend können Sie der Variablen mit dem folgenden Befehl die gewünschte Monatsliste zuweisen:
Monatsname = Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember")
In den bisherigen Beispielen haben Sie lediglich eindimensionale Datenfelder kennengelernt. Sie können aber auch zweidimensionale Datenfelder verwenden. Das ist z.B. sinnvoll, wenn Sie zu den Monatsnamen auch noch die jeweilige Anzahl Tage speichern möchten. Die Deklaration für ein solches Datenfeld sieht folgendermaßen aus:
Public Monatsdaten(1 To 12, 1 To 2) As Variant
Wahrscheinlich fragen Sie sich nun, warum das Datenfeld als Variant deklariert wird. Der Grund ist, dass man für das komplette Feld nur einen Datentyp angeben kann. Da die Anzahl der Tage eines Monats im Datenformat String nicht besonders sinnvoll erscheint, verwenden Sie hier den Datentypen Variant. Für Daten dieses Datentyps können beliebige Formate mit Ausnahme von Zeichenketten fester Länge und benutzerdefinierter Datentypen verwendet werden.
Die Zuweisung der Daten eines zweidimensionalen Feldes erfolgt beispielsweise wie in folgender Prozedur:
Sub MonatsdatenZuweisen() Monatsdaten(1, 1) = "Januar" Monatsdaten(2, 1) = "Februar" .... Monatsdaten(12, 1) = "Dezember" Monatsdaten(1, 2) = 31 Monatsdaten(2, 2) = 28 .... Monatsdaten(12, 2) = 31 End Sub
Zusätzlich zu den Monatsnamen enthält das Datenfeld nun noch die Anzahl Tage des jeweiligen Monats. Das Feld sieht nun etwa folgendermaßen aus:
Monatsdaten(X,Y)
Y=1
Y=2
X=1
Januar
31
X=2
Februar
28
…
…
…
X=3
Dezember
31
Auf die beschriebene Weise können Sie beliebig große Felder anlegen.
Dynamische Datenfelder
Dynamische Datenfelder können Sie verwenden, wenn Sie bei der Deklaration noch nicht genau wissen, wie viele Daten das Feld aufnehmen soll.
Wenn Sie beispielsweise Daten aus einer Textdatei einlesen möchten, aber nicht wissen, wie viele Zeilen die Datei enthält, ist ein dynamisches Datenfeld die richtige Wahl.
Für das folgende Beispiel legen Sie bitte eine Textdatei wie in Bild 2 an.
Bild 2: Textdatei mit einer Liste von Namen und Altersangaben
Die im folgenden vorgestellte Anwendung soll die Daten in einer Tabelle namens tblAltersangaben speichern. Sie fragen nun zu Recht, warum man die Einträge nicht direkt in eine geeignete Tabelle schreiben kann. Der Grund ist, dass man zunächst die Informationen einer Zeile mit einer geeigneten Funktion auseinandernehmen muss. Daher liest man den Inhalt der Textdatei zunächst in ein geeignetes Datenfeld ein. Anschließend übergibt man das Feld an eine Funktion zum Extrahieren der einzelnen Elemente einer Zeile. Anschließend kann man die Informationen in die einzelnen Felder einer Tabelle schreiben.
Mit der folgenden Prozedur können Sie die einzelnen Zeilen einer Textdatei in das Datenfeld Spalte einlesen:
Sub TextdateiLesen() Dim Spalte(1 To 10) As String Dim i As Integer Open "c:\Alter.txt" For Input As #1 i = 1 While Not EOF(1) Line Input #1, Spalte(i) i = i + 1 Wend Close #1 For i = 1 To 10 Debug.Print Spalte(i) Next i End Sub
Im vorliegenden Fall ist das Datenfeld allerdings statisch festgelegt und kann nur zehn Elemente enthalten.
Dementsprechend erhalten Sie eine Fehlermeldung, sobald die Datei mehr als zehn Einträge enthält. Bevor Sie aber nun für das Datenfeld eine entsprechend hohe Menge Speicherplatz reservieren und anschließend nur einen Bruchteil davon benötigen, deklarieren Sie das Datenfeld lieber als dynamisches Datenfeld. Der einzige Unterschied zur Deklaration eines statischen Datenfeldes ist, dass Sie weder die untere noch die obere Grenze des Datenfeldes angeben, sondern einfach eine leere Klammer angeben:
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