Home > Artikel > Ausgabe 1/2012 > Arrays

Arrays

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Arrays – auch Datenfelder genannt – bieten die Möglichkeit, mehrere gleichartige Daten in einer Art Liste zu speichern und über einen Index darauf zuzugreifen. Array können ein- oder mehrdimensional sein. Dieser Artikel zeigt, wie Sie Arrays deklarieren, diese mit Daten füllen und die gewünschten Informationen wieder abrufen. Außerdem lernen Sie eine Reihe VBA-Anweisungen kennen, mit denen der Umgang mit Arrays noch viel leichter wird.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1201_Arrays.mdb.

Array-Datentyp

Ein Array kann beliebige Datentypen annehmen. Die einzige Einschränkung ist: Jedes Element des Array muss den gleichen Datentyp besitzen. Dies ist jedoch keine große Einschränkung, denn die meisten Anwendungen von Array basieren ohnehin auf gleichartigen Daten.

Einfache Beispiele

Im einfachsten Fall ist ein Array zweidimensional. Das bedeutet, dass Sie für jeden Indexwert des Array entsprechend seiner Größe einen Wert im Array speichern können.

Wofür benötigt man solche Konstrukte? Nun, Sie könnten zum Beispiel zehn gleichartige Werte benötigen, die Sie in entsprechenden Variablen speichern - etwa so:

Dim str1 As String

Dim str2 As String

Dim str3 As String

...

str1 = "Müller"

str2 = "Meier"

str3 = "Schmitz"

Mit diesen Variablen können Sie nun verschiedene Dinge im Code anstellen. Dies hat nur zwei Nachteile: Erstens müssen Sie jeden Zugriff auf einen dieser Werte separat durchführen, auch wenn Sie mal eben die Werte aller Variablen ausgeben möchten. Mal eben die Daten aus einer Tabelle in die Variablen schreiben? Macht zehn Anweisungen. Die Daten im Debug-Fenster ausgeben? Wieder zehn Anweisungen. Und der zweite Nachteil: Wenn ein elfter Wert hinzu kommt, müssen Sie den kompletten Code anpassen.

Für solche Fälle gibt es Array. Für ein Array benötigen Sie nur ein einzige Variable, die beliebig viele Werte aufnimmt. Sie können gleich bei der Deklaration festlegen, wieviele Werte dies sind oder die Obergrenze später anpassen.

Schauen wir uns an, wie dies funktioniert. Wenn Sie beispielsweise eine Variable mit vier Werten verwenden möchten, deklarieren Sie diese wie folgt:

Dim strZahlen(3)

Wieso lautet der Wert in Klammern 3, wenn wir doch drei Werte benötigen? Ganz einfach: Der hier angegebene Wert gibt den Wert des größten Index-Eintrags an. Normalerweise beginnt die Zählung des Index bei Arrays bei 0, also können Sie die vier Indexwerte 0, 1, 2 und 3 verwenden.

In der folgenden Prozedur versuchen wir, mehr als diese vier Einträge zu füllen:

Public Sub EinfachesArray()

     Dim strZahlen(3) As String

     strZahlen(0) = "Null"

     strZahlen(1) = "Eins"

     strZahlen(2) = "Zwei"

     strZahlen(3) = "Drei"

     strZahlen(4) = "Vier"

End Sub

Dies führt zu dem Fehler aus Bild 1, und zwar in der Zeile, die versucht, einen Wert für den Index 4 zu vergeben.

Fehler beim Versuch, einen nicht vorhandenen Eintrag im Array zu referenzieren

Bild 1: Fehler beim Versuch, einen nicht vorhandenen Eintrag im Array zu referenzieren

Die Tatsache, dass der erste Indexwert 0 lautet, ist nicht unumstößlich. Wenn Sie im Kopf des betroffenen VBA-Moduls die folgende Zeile einfügen, beginnt die Zählung bei 1:

Option Base 1

Der Fehler bei der obigen Prozedur tritt nun nicht erst in der vierten, sondern direkt in der ersten Zeile auf: den Index mit dem Wert 0 gibt es nämlich nun nicht mehr. Normalerweise benötigen Sie aber keine Index-Änderung – es sei denn, Sie möchten Daten zwischen einem Array und einem anderen Objekt hin- und hertransferieren, dessen Index erst bei 1 beginnt. Dann können Sie besser den kleinsten Index mit Option Base festlegen als überall 1 abzuziehen oder hinzuzuaddieren, um mit gleichen Indexwerten arbeiten zu können.

Indexbereich

Sie können sich auch komplett von den vom System oder von Option Base vorgegebenen Index-Grenzen freimachen. Dazu geben Sie einfach eigene Indexgrenzen an – die folgende Routine läuft dann ohne Fehler durch:

Public Sub EinfachesArrayMitBereich()

     Dim strZahlen(0 To 4) As String

     strZahlen(0) = "Null"

     strZahlen(1) = "Eins"

     strZahlen(2) = "Zwei"

     strZahlen(3) = "Drei"

     strZahlen(4) = "Vier"

End Sub

Eigentlich ist die Angabe des Indexbereichs ohnehin die sinnvollste Art, ein Array zu deklarieren – vorausgesetzt, Sie kennen die Dimensionen des Arrays überhaupt bereits beim Deklarieren.

Ein- und mehrdimensionale Array

Die bisher vorgestellten Beispiele basierten auf eindimensionalen Array. Ein Array kann aber durchaus mehrere Dimensionen annehmen.

Wenn Sie beispielsweise ein Array mit zwei mal zwei Elementen deklarieren und mit entsprechenden Werten füllen möchten, verwenden Sie die folgende Routine:

Public Sub ZweiMalZwei()

     Dim intZahlen(1 To 2, 1 To 2) As Integer

     intZahlen(1, 1) = 1

     intZahlen(1, 2) = 2

     intZahlen(2, 1) = 3

     intZahlen(2, 2) = 4

End Sub

Arrays durchlaufen

Wenn Sie die Indexgrenzen eines Array kennen, können Sie die im Array gespeicherten Werte problemlos mithilfe einer Schleife durchlaufen.

Dazu verwenden Sie einfach eine For...Next-Schleife mit einer Laufvariable, die Sie später als Index für den Zugriff auf die im Array gespeicherten Werte verwenden:

Public Sub EinfachesArrayMitBereich()

     Dim strZahlen(0 To 4) As String

     Dim i As Integer

     strZahlen(0) = "Null"

     ... weitere Zuweisungen

     For i = 0 To 4

         Debug.Print strZahlen(i)

     Next i

End Sub

Indexgrenzen ermitteln

Auch wenn Sie die Indexgrenzen nicht kennen, können Sie ein Array problemlos durchlaufen. Die Grenzen ermitteln Sie dabei mit den beiden Funktionen UBound und LBound, denen Sie einfach den Namen der Array-Variablen übergeben:

Public Sub IndexgrenzenErmitteln()

     Dim strZahlen(3) As String

     Dim i As Integer

     strZahlen(0) = "Null"

     ... weitere Zuweisungen

     Debug.Print "Untere Grenze: " & LBound(strZahlen)

     Debug.Print "Obere Grenze: " & UBound(strZahlen)

     For i = LBound(strZahlen) To UBound(strZahlen)

         Debug.Print strZahlen(i)

     Next i

End Sub

Indexgrenzen zur Laufzeit einstellen

Wie bereits erwähnt, brauchen Sie die Indexgrenzen nicht direkt bei der Deklaration festzulegen – in manchen Fällen ist dies sogar noch nicht einmal möglich. Stattdessen deklarieren Sie einfach eine Variable mit einem leeren Klammernpaar.

Später erweitern Sie die Größe des Arrays beispielsweise innerhalb einer Schleife nach Wunsch. Dabei verwenden Sie die Anweisung ReDim und geben den Variablennamen des Array samt gewünschter Größe an.

Das Schlüsselwort Preserve sorgt dafür, dass bereits vorhandene Daten nicht gelöscht werden:

Public Sub DynamischesArray()

     Dim strMonate()

     Dim i As Integer

     For i = 1 To 12

         ReDim Preserve strMonate(1 To i)

         strMonate(i) = MonthName(i)

     Next i

     For i = 1 To 12

         Debug.Print strMonate(i)

     Next i

End Sub

Würden Sie das Schlüsselwort Preserve in diesem Fall weglassen, enthielte das Array bei der Ausgabe nur einen einzigen Wert, und zwar für das zwölfte Element.

Ein Array mit den Daten einer Tabelle füllen

Wenn Sie beispielsweise ein String-Array mit den Namen der Artikel der Tabelle tblArtikel füllen möchten, verwenden Sie eine Routine wie die Folgende:

Public Sub ArtikelArray()

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Dim strArtikel()

     Dim i As Integer

     Set db = CurrentDb

     Set rst = db.OpenRecordset("SELECT Artikelname FROM tblArtikel", dbOpenDynaset)

     Do While Not rst.EOF

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!