VBA Basics: Auflistungen mit Dictionarys

Im Artikel “VBA Basics: Auflistungen mit Collections” (www.vbentwickler.de/514) haben wir die Collection kennengelernt – eine einfache, geordnete Liste ohne Verweis. Ihr grösstes Manko: Es gibt keine Möglichkeit zu prüfen, ob ein Schlüssel existiert. Genau hier setzt das Dictionary aus der Microsoft Scripting Runtime an. Es bietet Exists, erlaubt das direkte Ändern von Werten und liefert Schlüssel und Werte als Array – damit ist es die erste Wahl für Duplikatprüfungen, Häufigkeitszählungen und Lookup-Tabellen im Speicher. Wie wir es einrichten, was es kann und wo Stolpersteine lauern, zeigt dieser Beitrag.

Das Dictionary einrichten

Das Dictionary steckt in der Bibliothek Microsoft Scripting Runtime (scrrun.dll). Bevor wir es per Early Binding nutzen können, müssen wir im VBA-Editor über Extras|Verweise den Eintrag Microsoft Scripting Runtime aktivieren (siehe Bild 1).

Verweis auf die Bibliothek Microsoft Scripting Runtime

Bild 1: Verweis auf die Bibliothek Microsoft Scripting Runtime

Alternativ funktioniert Late Binding – dann entfällt der Verweis, aber auch IntelliSense:

' Early Binding (mit Verweis)
Dim dic As New Scripting.Dictionary
' Late Binding (ohne Verweis)
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")

Für die Entwicklung empfehlen wir Early Binding wegen IntelliSense und Kompilierungsprüfung.

Die Member des Dictionary

Das Dictionary ist reichhaltiger als die Collection. Die wichtigsten Member:

  • Add Key, Item: fügt ein Schlüssel-Wert-Paar hinzu. Beachte: Der Schlüssel steht an erster Stelle – umgekehrt als bei der Collection.
  • Item(Key): der Zugriff über dic(Key) liefert den Wert zum Schlüssel. Wird einem nicht vorhandenen Schlüssel auf diese Weise ein Wert zugewiesen, wird der Eintrag automatisch angelegt.
  • Exists(Key): liefert True, wenn der Schlüssel vorhanden ist, sonst False.
  • Keys: liefert ein Array aller Schlüssel.
  • Items: liefert ein Array aller Werte.
  • Count: liefert die Anzahl der Einträge.
  • Remove(Key): entfernt einen einzelnen Eintrag.
  • RemoveAll: leert das gesamte Dictionary.
  • CompareMode: legt fest, ob Schlüssel binär (vbBinaryCompare) oder textuell (vbTextCompare) verglichen werden. Muss gesetzt werden, solange das Dictionary leer ist.
  • Key(Key): ändert einen bestehenden Schlüssel, ohne den Wert zu berühren.

Das Dictionary in Aktion

Ein erstes Beispiel – wir speichern Bundesländer-Kürzel und greifen gezielt darauf zu.

In Listing 1 sehen wir gleich drei Vorteile gegenüber der Collection: Exists statt Fehler-Workaround, direktes Ändern eines Werts per Zuweisung und dic.Keys als Array für die Schleife.

Public Sub DictionaryDemo()
    Dim dic As New Scripting.Dictionary
    Dim varKey As Variant
    dic.CompareMode = vbTextCompare
    dic.Add "BE", "Berlin"
    dic.Add "HH", "Hamburg"
    dic.Add "BY", "München"
    ' Existenz pruefen
    If dic.Exists("HH") Then
        Debug.Print dic("HH")   ' -> Hamburg
    End If
    ' Wert direkt aendern
    dic("BY") = "Bayern (München)"
    ' Alle Eintraege ausgeben
    For Each varKey In dic.Keys
        Debug.Print varKey & ": " & dic(varKey)
    Next varKey
End Sub

Listing 1: Dictionary mit Exists, Wertänderung und Keys

CompareMode: Gross- und Kleinschreibung

Standardmässig vergleicht das Dictionary Schlüssel binär – “hh” und “HH” wären also zwei verschiedene Einträge. In den meisten Access-Szenarien wollen wir das nicht.

Deshalb setzen wir CompareMode auf vbTextCompare, damit Schlüssel ohne Berücksichtigung der Gross-/Kleinschreibung verglichen werden.

Wichtig: CompareMode lässt sich nur setzen, solange das Dictionary leer ist. Enthält es bereits Einträge, gibt es Laufzeitfehler 5. Also immer direkt nach dem Erzeugen setzen.

Vorsicht: stille Anlage bei Item-Zugriff

Das Dictionary hat ein Verhalten, das regelmässig für Überraschungen sorgt: Greift man per dic(“XY”) auf einen Schlüssel zu, der nicht existiert, gibt es keinen Fehler.

Stattdessen legt das Dictionary den Schlüssel stillschweigend an – mit dem Wert Empty. Das ist beim Zählen nützlich (dazu gleich mehr), kann aber auch Geistereinträge erzeugen, wenn wir unvorsichtig sind.

Faustregel: Vor dem lesenden Zugriff immer Exists prüfen – oder die stille Anlage bewusst nutzen.

Praxis: Duplikate filtern

Aus einer Tabelle mit Kundendaten wollen wir eine Liste aller eindeutigen Orte gewinnen. Exists macht die Duplikatprüfung trivial:

Die Funktion aus Listing 2 liefert ein Array aller eindeutigen Orte.

Access, SQL und Cloud Automation

Unser exklusives Angebot für Dich!

VB-Entwickler
12,50 € im Monat*

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

PayPal VISA Mastercard SEPA
Kostenlos & unverbindlich

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 →