Home > Artikel > Ausgabe 5/2014 > Programmieren mit Collections

Programmieren mit Collections

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).

In einem früheren Artikel haben Sie bereits den Umgang mit Arrays kennengelernt. Damit können Sie ein- oder mehrdimensionale Felder von Daten verwalten. Nun schauen wir uns eine weitere Möglichkeit an, um Daten in einer Art Feld unterzubringen: das Collection-Objekt. Erfahren Sie, wie Sie ein solches Objekt mit Daten füllen, diese abrufen und welche Unterschiede es zum herkömmlichen Array gibt.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1405_Collections.mdb.

Collections erstellen

Im Gegensatz zu einem Array, dass einen der Basisdatentypen wie beispielsweise String oder Integer als Datentyp verwenden kann und dann auf diesen Typ begrenzt ist, ist eine Collection ein eigenes Objekt. Dementsprechend deklarieren Sie dieses zunächst etwa wie folgt:

Dim colKunden As Collection

Der Zugriff auf die Eigenschaften und Methoden des Objekts gelingt somit noch längst nicht – die Ausgabe der Anzahl der enthaltenen Elemente mit der Count-Eigenschaft, die ja aktuell 0 betragen sollte, führt gleich zu einem Fehler (siehe Bild 1). Der Grund ist einfach: Sie müssen das Collection-Objekt erst noch instanzieren.

Fehler beim Zugriff auf ein nicht instanziertes Collection-Objekt

Bild 1: Fehler beim Zugriff auf ein nicht instanziertes Collection-Objekt

Dies können Sie in der gleichen Zeile erledigen, welche auch das Objekt deklariert:

Dim colKunden As New Collection

Wir haben es allerdings gern etwas kontrollierter und zu dem Zeitpunkt, zu dem wir das Objekt benötigen. Daher instanzieren wir es in einer eigenen Zeile mit der New-Anweisung und der anschließenden Zuweisung zu der dafür deklarierten Objektvariablen colKunden:

Dim colKunden As Collection

Set colKunden = New Collection

Debug.Print colKunden.Count

Keine Dimensionierung

Im Gegensatz zu einem Array, dass Sie ja entweder gleich beim Deklarieren dimensionieren oder dynamisch während des Aufbaus des Arrays mit der ReDim-Anweisung, brauchen Sie ein Array nicht zu dimensionieren. „Dimensionieren” bedeutet in diesen Zusammenhang, dass Sie nicht zuvor festlegen müssen, wieviele Elemente das Objekt einmal enthalten soll.

Das Collection-Objekt bietet die folgenden Methoden und Eigenschaften an:

  • Add: Fügt ein Element zur Collection hinzu. Die Methode erwartet zumindest den Parameter Item und somit den hinzuzufügenden Wert und bietet drei weitere optionale Paramter an: Key, Before und After.
  • Count: Gibt die Anzahl der aktuell im Collection-Objekt enthaltenen Elemente aus.
  • Item: Erlaubt den gezielten Zugriff auf eines der Elemente über den Index oder über den Key.
  • Remove: Entfernt ein Element der Collection. Das zu entfernende Objekt wird über den Parameter Item angegeben – mehr dazu weiter unten.

Einfaches Element zur Collection hinzufügen

Die einfachste Art, ein Element zu einer Collection hinzuzufügen, ist die Angabe des Elements als ersten Parameter der Add-Methode:

colKunden.Add "Kunde 1"

Auf diese Weise fügen Sie ein oder mehrere Elemente zur Collection hinzu.

Zugriff über den Index

Um die Elemente abzufragen, die Sie auf diese Weise hinzugefügt haben, greifen Sie über die Item-Eigenschaft auf das Element mit dem entsprechenden Index zu.

Der Index ist 1-basiert, sodass Sie den mit der obigen Anweisung hinzugefügten Eintrag mit folgender Anweisung auslesen können:

Debug.Print colKunden.Item(1)

Element über den Index löschen

Wenn Sie das Element löschen wollen, können Sie dies ebenfalls nur mit der Kenntnis des Indexes des Elements erledigen:

colKunden.Remove 1

Bislang haben wir nur mit Collection-Elementen gearbeitet, die wir ohne Angabe eines Keys angelegt haben.

Damit können wir ausschließlich die Funktion eindimensionaler Arrays nachbilden. Nun schauen wir uns an, wie Sie die Key-Eigenschaft nutzen können.

Anlegen mit Key

Beim Anlegen eines Elements können Sie auch die Key-Eigenschaft nutzen. Diese entspricht etwa dem Namen bei einem Name-Wert-Paar.

Dies sieht etwa wie folgt aus:

colKunden.Add "André", "Vorname"

colKunden.Add "Minhorst", "Nachname"

Wir fügen der Collection so zwei Elemente hinzu, die unterschiedliche Keys und Werte haben.

Anlegen per Reihenfolge

Die beiden letzten Parameter der Add-Methode, Before und After, können Sie verwenden, um Elemente vor oder hinter bestehenden Elementen einzufügen.

Im folgenden Beispiel fügen wir beispielsweise erst einen Wert 1 und dann einen Wert 2 zur Collection hinzu. Dann sortieren wir hinter dem Element mit dem Index 1 ein weiteres Element ein:

Dim col As Collection

Dim var As Variant

Set col = New Collection

col.Add "1"

col.Add "2"

col.Add "Zwischen 1 und 2", , , 1

For Each var In col

Debug.Print var

Next var

Zugriff auf die Werte

Den Wert des Elements mit dem Key namens Vorname können Sie nun auf folgende Arten ausgeben:

Debug.Print colKunden(1)

Debug.Print colKunden.Item(1)

Debug.Print colKunden("Vorname")

Debug.Print colKunden.Item("Vorname")

Interessanterweise können Sie aber auch die Ausrufezeichen-Notation verwenden, um über den Key auf ein Element zuzugreifen:

Debug.Print colKunden!Vorname

Einträge ändern

Der Schwachpunkt des Collection-Objekts ist, dass Sie die Werte vorhandener Elemente nicht ändern können – also über eine einfache Zuweisung.

Dies hier klappt also nicht (Laufzeitfehler 424, Objekt erforderlich):

col.Add "Wert", "Name"

col.Item("Name") = "Neuer Wert"

Wenn Sie allerdings ohnehin mit dem Key arbeiten, können Sie das betroffene Element ja schnell löschen und dann ersetzen:

col.Add "Wert", "Name"

col.Remove "Name"

col.Add "Neuer Wert", "Name"

Dies würfelt natürlich die Reihenfolge durcheinander, wenn das zu ersetzende Element nicht das letzte Element der Collection ist. Um dies zu verhindern, nutzen Sie wiederum einen der Parameter Before oder After der Add-Methode.

Objekte per Schleife durchlaufen

Sie können die einzelnen Elemente der Collection auch in Schleifen durchlaufen. Das erste Beispiel zeigt, wie dies mithilfe einer For Each-Schleife gelingt.

Hier speichern wir die einzelnen Elemente in einer Variant-Variablen namens var, um dann ihren Inhalt auszugeben:

Dim colKunden As Collection

Dim var As Variant

Set colKunden = New Collection

colKunden.Add "André", "Vorname"

colKunden.Add "Minhorst", "Nachname"

For Each var In colKunden

Debug.Print var

Next var

Dies können Sie auch mit einer For...Next-Schleife realisieren.

Diese verwendet 1 als kleinsten und den Wert der Count-Eigenschaft als größten Wert und greift dann über den Wert der Laufvariablen i als Index auf die Elemente der Collection zu:

Dim colKunden As Collection

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!