Access Anfänger: Verwendung von Enum-Auflistungen

Aus DBWiki
Wechseln zu: Navigation, Suche

Der Datentyp Enum fasst eine Gruppe von Konstanten des Datentyps Long zusammen.

Enum-Auflistungen helfen, den Code transparenter und lesbarer zu machen. Auch in Access kommen eine Vielzahl von Enum-Auflistungen zum Einsatz. Beispiele hierfür sind die SysCmd-Methode oder gar die Docmd.RunCommand -Methode (die mit über 500 Enum-Konstanten aufwarten kann). Wer mit dem Enum-Datentyp arbeitet, kann seine eigenen Prozeduren mit einer Art IntelliSense ausstatten.

[Private/Public] enMeinBeispiel As Enum
  mbWert1 = 123
  mbWert2 = 568
  mbWert3 = 756
End Enum

Lässt man die Folgewerte (hier ab mbWert2) weg, wird der Wert automatisch vom Startwert (hier: 123) ausgehend um 1 erhöht. Lässt man den Startwert weg, fängt die Zählung bei 0 an.

Dies nur ganz kurz zum Hintergrund, ausführliche Informationen können der Online-Hilfe von Access entnommen werden (einfach im VBE das Wort "Enum" mit der Maus markieren und F1 drücken).

Was man unter anderem mit so einer Enum-Auflistung anstellen kann, soll das nachfolgende Beispiel zeigen. Hier wird eine Standardfunktion beschrieben, die ein paar Grundinformationen zur aktuellen Datenbank kapselt. Das Beispiel ist recht einfach gehalten, natürlich kann man auch schwerverdaulicheres in so eine praktische Mehrzweckfunktion verpacken. Der Vorteil ist, dass man den Enum-Datentyp als Parameter an eine Prozedur übergeben kann und man sofort beim Eintippen der Parameter die zuvor definierte Auswahl erhält (IntelliSense).

Noch etwas zur Schreibweise: Um Enum-Auflistungen von anderen Konstanten zu unterscheiden, stellt man dem Namen in der Regel das Präfix ‚en’ voran. Die einzelnen Konstanten innerhalb der Auflistung erhalten ein Präfix, das auf den Namen der Enum-Auflistung schließen lässt (mb = MeinBeispiel).

Erzeuge ein allgemeines Modul und füge folgenden Code ein:

Option Compare Database
Option Explicit
 
Public Enum enInfo
 
  ifAnwendungspfad             '= 0
  ifAnwendungsName             '= 1
  ifAnwendungsPfadUndName      '= 2 usw.
  ifAnwendungsDateiEndung
  ifIstRuntime
  ifArbeitsgruppenDatei
  ifAccessPfad
  ifAccessVersion
  ifAnwenderName
 
End Enum
 
Public Function DBInfo(Info As enInfo) As Variant
  Select Case Info
    Case ifAnwendungspfad
      DBInfo = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Dir(CurrentDb.Name)))
    Case ifAnwendungsName
      DBInfo = Dir(CurrentDb.Name)
    Case ifAnwendungsPfadUndName
      DBInfo = CurrentDb.Name
    Case ifAnwendungsDateiEndung
      DBInfo = Right(CurrentDb.Name, 3)
    Case ifIstRuntime
      DBInfo = SysCmd(acSysCmdRuntime)
    Case ifArbeitsgruppenDatei
      DBInfo = SysCmd(acSysCmdGetWorkgroupFile)
    Case ifAccessPfad
      DBInfo = SysCmd(acSysCmdAccessDir)
    Case ifAccessVersion
      DBInfo = SysCmd(acSysCmdAccessVer)
    Case ifAnwenderName
      DBInfo = CurrentUser()
    Case Else
      DBInfo = "ungültiger Parameter"
  End Select
End Function

Der Aufruf der Funktion erfolgt z.B. im Direktfenster mit

Debug.Print DBInfo(ifArbeitsgruppenDatei)

und das Ergebnis ist z.B.

C:\PROGRAMME\GEMEINSAME DATEIEN\SYSTEM\SYSTEM.MDW

Zusätzliche Hinweise

  • Enums eignen sich auch hervorragend für Klassenmodule, da man sie hier (im Gegensatz zu normalen Konstanten) als Public definieren kann.
  • in den allermeisten Fällen, in denen man eine Enum definiert, ist es am besten, eine explizite Wertedefinition wegzulassen, da eine Enum meist nur zur Unterscheidung von Fällen wie im Beispiel oben verwendet wird und nicht wegen ihrer Werte. Dadurch ist es leichter, später an beliebiger Stelle der Enum-Definition neue Einträge hinzuzufügen.
  • es ist empfehlenswert, die einzelnen Einträge einer Enum mit dem Namen der Enum als Präfix zu beginnen, da die Enum-Einträge nicht nur innerhalb der Enum-Definition eindeutig sein müssen, sondern innerhalb des verwendeten Namensraumes der Enum (Public oder Private) eindeutig, so als hätte man einzelne Konstanten definiert. Auf diese Weise kann es nie zu Namensüberschneidungen kommen.
  • Enums können auch Compilerprobleme verursachen. Hat man Enums definiert und im Code verwendet und ruft "Debug" - "Compile" aus dem VBA-Editor auf, kann es sein, dass eine Enum-Definition als nicht vorhanden angezeigt wird, obwohl sie vorhanden ist und in der Vergangenheit vielleicht schon längst funktioniert hat. Abhilfe: Irgendeine der definierten Enums (am besten die, die das Problem verursacht hat) namentlich verändern, die Zeile verlassen und den Namen wieder zurück ändern (nicht per Undo). Dadurch wird der Namespace des VBA-Editors/Compilers neu gefüllt und der Compile-Vorgang funktioniert wieder. Diese Prozedur kann im Laufe der Entwicklung einer Datenbank häufiger notwendig sein, sollte einen aber nicht davon abhalten, sie zu benutzen.
  • Vorsicht bei der Namensvergabe: Bevor die Zeile "Enum NamederEnum" mit dem Cursor verlassen wird, sollte "NamederEnum" ein Name sein, der nicht schon anderweitig für eine Enum vergeben wurde. Ansonsten kann es zu einem Totalabsturz des VBA-Editors kommen. Vor der Definition einer neuen Enum also am besten immer erst speichern (das kann auch bei Subs/Functions oder Type-Definitionen passieren, wenn auch seltener).