Spaß beim Sammeln

Es gibt ja nicht nur die großen Themen, bei denen man viele Worte machen muss, um alles auch nur halbwegs auf die Reihe zu kriegen. Nein, auch die kleinen Tipps sind unter Umständen sehr hilfreich. Und manchmal fragt man sich, wieso man nicht selbst längst auf diese Idee gekommen ist.

Heute geht es um Collections. Das ist eigentlich ein ziemlich einfaches Thema, bei dem mich anfangs nur eine Kleinigkeit gestört hat. Also fangen wir vorn an.

Werbung

Die Collection ist ein vordefinierter Datentyp in VBA, der beliebig viele Objekte aufnehmen kann. Diese werden in einer Liste verwaltet und lassen sich dann mittels „For-Each-Next“-Schleife sehr einfach durchgehen.

Was ich daran als störend empfunden habe, war die Einschränkung auf den Datentyp „Object“, die jeses Element der Liste haben muss. Anders als beispielsweise in Python sind aber Strings oder numerische Datentypen in VBA keine Objekte. Es schien also zunächst so, als würde es nicht gehen.

Doch der Trick ist wirklich simpel:

  1. Public Sub test()
  2.  
  3. Dim col As New Collection
  4. Dim s As str
  5.  
  6. Set s = New str
  7. s = "eins"
  8. col.Add s
  9.  
  10. Set s = New str
  11. s = "zwei"
  12. col.Add s
  13.  
  14. Debug.Print col.Count; " Elemente"
  15.  
  16. For Each s In col
  17.     Debug.Print s
  18. Next s
  19.  
  20. End Sub

Und was ist nun dieses „str“? Im einfachsten Fall ein Klassenmodul mit einer öffentlichen Deklaration einer String-Variablen:

  1. Option Compare Database
  2. Option Explicit
  3.  
  4. Public text As String
Werbung

Der Nachteil dabei ist jedoch, dass wir dann immer die Eigenschaft .text mit angeben müssen. Im obigen Beispiel müsste also statt s = "eins" dort stehen s.text = "eins".

Um auf dieses Standardelement verzichten zu können, müssen wir den Weg über Properties gehen. Das ist in der Programmierung des Klassenmoduls ein klein wenig aufwändiger, aber es lohnt sich. Das Prinzip sollte hinlänglich bekannt sein:

  1. Option Compare Database
  2. Option Explicit
  3.  
  4. Private m_text As String
  5.  
  6. Public Property Get text() As String
  7.     text = m_text
  8. End Property
  9.  
  10. Public Property Let text(ByVal NewValue As String)
  11.     m_text = NewValue
  12. End Property

Abgesehen davon eröffnet das Property Let dann auch die Möglichkeit, bei der Zuweisung gleich eine Werteprüfung vorzunehmen.

Nun muss das Klassenmodul gespeichert und in eine Textdatei exportiert werden. Diese öffnen wir dann mit einem Texteditor und suchen darin das Property. Hierin ergänzen wir mindestens die Zeile Attribute text.VB_UserMemId = 0. Wenn das Element auch noch eine Beschriftung bekommen soll, so ist das auch einfach möglich:

  1. Public Property Get text() As String
  2. Attribute text.VB_UserMemId = 0
  3. Attribute text.VB_Description = "Contains the assigned string"
  4. text = m_text
  5.  
  6. End Property

Diese Datei wird nun gespeichert. Zurück im Access-VBA-Editor löschen wir zunächst das Klassenmodul und importieren es dann erneut. Das Löschen ist wichtig, da sonst ein Duplikat mit Namen „Modul1“ entsteht, was nicht gewünscht ist. Wer mit OASIS arbeitet, kann auch dessen Importfunktion verwenden und muss dann das Modul vorher nicht löschen, da das OASIS selbst übernimmt.

Überraschend ist nun allerdings, dass die beiden hinzugefügten Zeilen nicht im VBA-Editor sichtbar sind. Zur Überprüfung öffnen wir den Objektkatalog und selektieren unsere Klasse. Wie im nachfolgenden Screenshot zu erkennen ist, ist das Element „text“ mit einem anderen Icon versehen als zum Beispiel „m_text“. Klicken wir dort drauf, dann sehen wir im unteren Bereich des Objektkatalogs den Hinweis, dass es sich um das Standardelement handelt. Ebenso wird der Texthinweis dort dargestellt.

Nun sollte die obige „Sub test“ funktionieren.

VBA-Objektkatalog mit einem StandardelementDie Änderung bleibt übrigens erhalten und wird von OASIS auch beim nächsten Export ebenfalls exportiert. Die Änderung wird also auch über die Quellcodeverwaltung archiviert.

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

drei + 18 =