Arrays haben eine feste Grösse – oder müssen mit ReDim Preserve umständlich vergrössert werden. Sobald wir eine Liste brauchen, die während der Laufzeit wächst und schrumpft, ist die Collection das Mittel der Wahl. Sie gehört zur VBA-Laufzeitbibliothek, steht ohne zusätzlichen Verweis in jedem Projekt zur Verfügung und lässt sich mit For Each durchlaufen. Dieser Beitrag zeigt, was die Collection kann, wo ihre Grenzen liegen und wie wir sie in der Praxis einsetzen.
Was ist eine Collection?
Eine Collection ist eine geordnete Liste von Elementen. Jedes Element kann einen beliebigen Datentyp haben – Strings, Zahlen, Objekte oder sogar weitere Collections. Die Reihenfolge der Elemente bleibt erhalten, und jedes Element bekommt automatisch einen numerischen Index, der bei 1 beginnt.
Eine neue Collection legen wir so an:
Dim col As New Collection
Mit New wird die Instanz automatisch beim ersten Zugriff auf die Variable erzeugt – nicht bereits in der Deklarationszeile selbst. Alternativ können wir Dim col As Collection schreiben und später Set col = New Collection aufrufen – das ist nützlich, wenn wir die Collection erst unter bestimmten Bedingungen brauchen.
Die Member der Collection
Die Collection ist bewusst schlank. Sie bietet genau vier Member:
- Add Item, [Key], [Before], [After]: fügt ein Element hinzu. Item ist der Wert, Key ein optionaler, eindeutiger String-Schlüssel. Mit Before oder After steuern wir die Einfügeposition.
- Item(Index): gibt das Element an Position Index zurück (1-basiert) oder das Element mit dem angegebenen Schlüssel. Item ist die Standardeigenschaft – col(3) ist gleichbedeutend mit col.Item(3).
- Count: liefert die Anzahl der Elemente.
- Remove(Index): entfernt das Element an der angegebenen Position oder mit dem angegebenen Schlüssel. Die Indizes der nachfolgenden Elemente verschieben sich automatisch.
Was auffällt: Es gibt kein Exists, kein Replace und kein Clear oder RemoveAll.
Wer die Collection leeren will, kann zwar alle Elemente rückwärts mit Remove löschen, schneller und sauberer ist aber eine neue Instanz: Set col = New Collection.
Elemente hinzufügen
Im einfachsten Fall fügen wir Elemente ohne Schlüssel hinzu. Sie landen am Ende der Liste und sind über ihren Index erreichbar (siehe Listing 1).
Public Sub CollectionFuellen() Dim col As New Collection col.Add "Berlin" col.Add "Hamburg" col.Add "München" Debug.Print col(1) ' -> Berlin Debug.Print col(2) ' -> Hamburg Debug.Print col.Count ' -> 3 End Sub
Listing 1: Elemente hinzufügen und per Index abrufen
Arbeiten mit Schlüsseln
Geben wir beim Add einen Schlüssel an, können wir später über diesen Schlüssel auf das Element zugreifen – unabhängig von seiner Position. Der Schlüssel muss ein String sein und innerhalb der Collection eindeutig. Beachte die Reihenfolge: Zuerst der Wert, dann der Schlüssel – das ist anders als beim Dictionary, wo der Schlüssel an erster Stelle steht.
Ein wichtiges Detail: Nach dem Remove in Listing 2 verschiebt sich der Index. col(2) liefert jetzt “München”, nicht mehr “Hamburg”. Wer über den Index auf Elemente zugreift und gleichzeitig entfernt, muss die Schleife rückwärts laufen lassen – dazu gleich mehr.
Public Sub CollectionMitKeys() Dim col As New Collection ' Add Wert, Schluessel col.Add "Berlin", "BE" col.Add "Hamburg", "HH" col.Add "München", "BY" ' Zugriff per Schluessel Debug.Print col("HH") ' -> Hamburg ' Zugriff per Index geht weiterhin Debug.Print col(1) ' -> Berlin ' Entfernen per Schluessel col.Remove "HH" Debug.Print col.Count ' -> 2 End Sub
Listing 2: Collection mit Schlüsseln
Einfügeposition steuern
Mit den Argumenten Before und After können wir Elemente an einer bestimmten Position einfügen statt immer am Ende. Das ist ein Vorteil, den das Dictionary nicht bietet:
Dim col As New Collection col.Add "Zweiter" col.Add "Erster", Before:=1 col.Add "Dritter", After:=2 ' Ergebnis: Erster, Zweiter, Dritter
Durchlaufen mit For Each
Die Collection lässt sich mit For Each durchlaufen. Die Laufvariable muss als Variant deklariert sein, wenn die Collection Werte enthält, oder als der jeweilige Objekttyp, wenn sie Objekte enthält:
Unser exklusives Angebot für Dich!
(Gilt für den Abschluss eines Jahres-Abonnements.)
Hier geht’s weiter →Die ersten 4 Wochen kostenlos testen – voller Zugriff auf alle Artikel, vollständigen Code und Beispieldatenbanken. Kein Risiko: Wenn es nicht passt, kündigst Du einfach innerhalb der ersten vier Wochen.
Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?
Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?
In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.
Jetzt kostenloses Access-Audit anfordern →