Auflistungen

Manchmal existieren mehrere gleichartige Unterobjekte. Unsere Autos sollen z. B. stets 2 Airbags besitzen; einen für den Fahrer und einen für den Beifahrer. Im Folgenden gehen wir davon aus, dass wir bereits eine Klasse namens Airbag erstellt haben, die wir als Unterobjekt des Autos nutzen wollen - so, wie wir das gerade mit dem Radio gemacht haben. Ein Airbag soll eine Name-Eigenschaft und einer aktivieren-Methode haben. Da aber ein Auto mehrere Airbags hat, benötigt das Auto-Objekt eine Auflistung, über die man auf die eigentlichen Airbag-Unterobjekte zugreift. Dafür stellt VBA das Collection-Objekt bereit. Wir erstellen also einfach eine weitere Eigenschaft namens Airbags vom Typ Collection. Anschließend schreiben wir eine Prozedur, die Airbags mit Leben füllt.

Auto
Private myAirbags As New Collection

Public Property Get Airbags() As Collection Set Airbags = myAirbags End Property
Public Sub
AirbagsEinbauen() Dim Air1 As New Airbag, Air2 As New Airbag Air1.Name = "Fahrer" Air2.Name = "Beifahrer" myAirbags.Add Air1, "Fahrer" myAirbags.Add Air2, "Beifahrer" End Sub

Wenn nun die Prozedur AirbagsEinbauen ausgeführt wird, werden erst zwei neue Airbags deklariert, die jeweils eine Name-Eigenschaft zugewiesen bekommen.

Eine Auflistung besitzt stets noch die Eigenschaft Count:

Debug.Print meinAuto.Airbags.Count
 2

Um nicht die Auflistung Airbags, sondern einen bestimmten Airbag anzusprechen, verwendet man seine Nummer:

Debug.Print meinAuto.Airbags(1).Name
Fahrerairbag

Oft haben die Objekte einer Auflistung einen eindeutigen Bezeichner, den man anstelle der Nummer verwenden kann, um es anzusprechen. Häufig ist der Bezeichner identisch mit der Name-Eigenschaft des Objekts:

meinAuto.Airbags("Fahrer").aktivieren
Wahr

Eine Collection hat zwei wichtige Methoden: Add und Remove. Damit können der Auflistung Objekte hinzugefügt bzw. entfernt werden. Collection.Add erwartet mindestens das hinzuzufügende Objekt als Parameter, außerdem kann man noch eine Zeichenfolge angeben, mit der man das Objekt eindeutig identifizieren kann. Falls man an einer anderen Stelle innerhalb der Reihenfolge einfügen will, könnte man als dritten Parameter die Nummer bzw. die Identifizierungszeichenfolge eines schon vorhandenen Objekts angeben.

Nachdem AirbagsEinbauen() ausgeführt wurde, können wir die Airbags als Unterobjekte des Autos ansprechen:

Modul1
Public Sub Autos()
Dim Familienkutsche As New Auto

Familienkutsche.AirbagsEinbauen
Familienkutsche.Airbags(1).aktivieren
Familienkutsche.Airbags("Beifahrer").aktivieren

End Sub

Interessanterweise ist es dem Collection-Objekt völlig egal, welchen Datentyp seine Elemente haben. Sie müssen nicht einmal alle den gleichen Datentyp haben. So gesehen, kann Collection also auch anstelle von Arrays verwendet werden, und bietet dabei sogar noch eine größere Flexibilität. Man sollte nur bedenken, dass diese Flexibilität zu Lasten der Performance geht, wenn die Collection etwas größer wird oder ständig Elemente hinzugefügt oder entfernt werden.