Eine “enum” mit .count? Geht das in VBA?

Letzte Änderung am 18. Mai 2023 by Christoph Jüngling

Nach langer Zeit mal wieder ein Tipp für Visual Basic for Applications (VBA). Eine Enumeration (“enum”) ist sicher jedem VB-Entwickler bekannt. Manchmal ist es vielleicht nötig, diese in ihrer Gänze zu erfassen, weil man z.B. eine Statistik der auftauchenden Fehler anlegen möchte. Dann kann es hilfreich sein, vorab ein entsprechend großes Array zu dimensionieren, und die einzelnen Integer-Elemente dann bei Bedarf hochzuzählen. Doch wie groß sollte das Array sein?

Klar, eine Konstante mit der Dimension wäre eine Lösung. Die hat aber den Nachteil, dass ich jedes mal, wenn ich einen neuen Fehler hinzufüge, auch diese Konstante anpassen muss. Vergesse ich das … BUMM. Doch es geht einfacher: Lege einfach eine Eigenschaft wie “count” als letztes Element der Enum an. Da die Enum automatisch mit 0 beginnend nummeriert wird, ist dieses “count” dann zwangsläufig mit dem richtigen Wert vorbelegt: Count enthält dann genau die Anzahl aller Elemente mit Ausnahme von sich selbst.

Public Enum eProjectErrorNumbers
    ERR_INTERNAL                ' Internal error
    ERR_NO_FILE
    ERR_NO_PATH
    ERR_ABORTED
    ERR_ILLEGAL_VALUE
    
    count                       ' Must always be the latest entry!
End Enum

Im Beispiel bekäme ERR_INTERNAL also den Wert 0 zugewiesen, ERR_ILLEGAL_VALUE die 4 und count den Wert 5. Und — abgesehen von “count” selbst haben wir genau 5 Elemente in der Enum. Und das passt immer, auch wenn wir Elemente hinzufügen. Hauptsache der “count” ist immer das letzte Element und es wird keine direkte Wertzuweisung vorgenommen.

Dim statistik(eProjectErrorNumbers.Count - 1) As Integer

Dieses Array hat genau die Dimensionen wie die Enum, und es können sogar die Enums selbst als Index verwendet werden:

Debug.Print statistik(ERR_ABORTED)

Und wenn doch eine direkte Zuweisung vorgenommen werden muss? Tja, dann muss der “count” leider auch eine bekommen und die schöne Automatik ist perdu. Aber immerhin funktioniert dann die Verwendung im restlichen Code exakt genau so, denn die Semantik ist dieselbe.

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

8 − 6 =