Access Anfänger: Wo schreibe ich den VBA-Code hin?

Aus DBWiki
Wechseln zu: Navigation, Suche

Code wird in Modulen gespeichert

VBA-Code besteht jeweils optional aus Konstanten-, Variablen-, Typen-, Enum- und API-Deklarationsanweisungen im Modulkopf (also am Anfang eines Moduls). Darauf folgen Sub-, Property- und Funktionsdeklarationen, im allgemeinen Methoden genannt, in denen Anweisungsschritte (Befehle) zeilenweise aufgeführt werden. Der Code wird im VBA-Editor als ganz normaler ANSI-Text entsprechend der Systemeinstellung erstellt, bearbeitet oder gelöscht. Der VBA-Editor kann mit der Tastenkombination Alt+F11  geöffnet und mit Alt+Q  geschlossen werden.

Der so erstellte Code wird in Modulen gespeichert. Das Speichern von neuem oder verändertem Code findet nicht automatisch statt, sondern muss explizit per Tastenkombination Strg+S  bzw. über das Speichern-Symbol in der Symbolleiste angewiesen werden. Beim Schließen eines Formulars bzw. eines Berichts erfolgt eine Rückfrage, ob Änderungen am Entwurf und damit auch am VBA-Code gespeichert werden sollen. Das gleiche gilt auch für allgemeine Module beim Schließen der Datenbank.

Formular- und Berichtsmodule

Formulare und Berichte besitzen eigene Klassenmodule, sofern ihre Eigenschaft Enhält Modul gesetzt ist. Rumpfdeklarationen von Ereignisprozeduren werden, sofern [Ereignisprozedur] im Eigenschaftsfenster für ein Formular-, für ein Berichts- oder für ein Steuerelement-Ereignis ausgewiesen ist, dann in ihr zugehöriges Klassenmodul eingetragen, wenn man auf den kleinen Knopf mit der Ellipse am rechten Rand des Ereignisses im Eigenschaftsfenster klickt. Fehlt der Eintrag [Ereignisprozedur, wird ein Auswahldialog eingeblendet, der die Auswahl eines Genarators zulässt. Bei Auswahl des sogenannten Code-Generator werden dann beide zuvor beschriebenen Schritte in einem Durchgang ausgeführt. Es wird also [Ereignisprozedur] beim Ereignis eingetragen, und es wird zum Klassenmodul im VBA-Editor gewechselt. Dort findet man eine entsprechende Rumpfdeklaration der Ereignisprozedur vor. Ausserdem wird zusätzlich sichergestellt, dass auch die Eigenschaft Enhält Modul auf Ja gesetzt ist.

Ereignisprozeduren haben standardmäßig einen privaten Gültigkeitsbereich. Aus diesem Grund ist ihnen das Schlüsselwort Private vorangestellt, was bedeutet, dass sie nur intern im Klassenmodul selbst direkt aufrufbar sind. Es ist erlaubt, diesen Gültigkeitsbereich mit dem Schlüsselwort Public oder Friend zu überschreiben, um die Prozedur auch extern ausführen zu können. Da jedoch der Aufruf von Ereignisprozeduren mittels Code allgemein als schlechter Stil gilt, ist es besser, eine eigene Public Methode anzulegen, deren Code dann auch gemeinsam von der Ereignisprozedur mitgenutzt werden kann.

Beispiel für eine Private Sub:

Private Sub EineSchaltflaeche_Click()
   MsgBox "Heute ist der " & Date
End Sub

Beispiel für eine Public Sub und deren internen Aufruf:

Public Sub ZeigeDatum()
   MsgBox "Heute ist der " & Date
End Sub
 
Private Sub EineSchaltflaeche_Click()
   ZeigeDatum
End Sub

Setzt man die Eigenschaft Enhält Modul des Formular- oder Berichtsklassenmoduls auf Nein, wird nach Bestätigung des daraufhin erscheinenden Dialogs sämtlicher VBA-Code des Klassenmoduls gelöscht und geht anschließend unwiderruflich verloren.

Allgemeine Module

Im Gegensatz dazu gibt es sog. "öffentliche" Sub-Prozeduren und Funktionen, die an jeder Stelle im Programm aufgerufen werden können. Sie werden in einem allgemeinen (globalen) Modul gespeichert, und mit dem Begriff Public gekennzeichnet.

Beispiel:

Public Function EineFunktion(S As Long) As Long
   EineFunktion = S + 1
End Function


So kann ein allgemeines Modul erstellt, und Code eingefügt werden:

  1. Code-Editor öffnen
  2. im Projekt-Explorer (linkes Fenster) mit rechter Maustaste Einfügen - Modul auswählen,
    oder Menüleiste Einfügen - Modul
  3. ein neues leeres Modul wird angezeigt
  4. Code in das Modul einfügen
  5. das Modul abspeichern Strg+S
  1. Dabei fragt Access nach dem zu vergebenden Namen des Moduls. Es wird ein Name, z.B. Modul1 vorgeschlagen, der entweder übernommen oder geändert werden kann. Das Modul sollte anders als irgendeine der darin enthaltenen Funktionen, und auch anders als die Datenbank (bzw. das Projekt) selbst benannt werden. Es ist deshalb sinnvoll, Module durchgehend mit einem bestimmten Präfix (wie mdl oder mod) zu benennen, z.B. modAllgemein.
  2. den so gespeicherten Code kompilieren (Debuggen - Kompilieren von ...)
    Durch das Kompilieren werden eventuell noch enthaltene Codefehler gleich im Vorfeld angezeigt.

Aufruf

Die erstellte Sub-, Ereignis-Prozedur/Funktion ruft man dann dort auf, wo man sie braucht, also z.B.

  • im Load-Ereignis des Startformulars, wenn es um eine Einmalaktion beim Starten der Anwendung geht
  • im BeforeUpdate-Ereignis eines Formularfeldes, wenn es um eine Plausibilitätsprüfung geht
  • im Click-Ereignis einer Schaltfläche für schaltflächen-gesteuerte Aktionen


Ein Aufruf mittels einer Schaltfläche kann dann so aussehen:

Private Sub Button_Click()
   MsgBox "13 + 1 = " & EineFunktion(13)
End Sub


Eine Konversionsfunktion kann man in einem berechneten Abfragefeld für eine Aktualisierungsabfrage verwenden. Die SQL-Anweisung dieser Abfrage könnte dann so aussehen:

UPDATE EineTabelle
SET    EinFeld = EineFunktion( EinFeld )

Im Abfrageentwurf (QBE-Editor) sind im Gegensatz zu SQL die Parameter der Sub-Prozedur/Funktion durch Semikola, anstelle von Kommata zu trennen. Maßgebend ist das in der Windows-Systemeinstellung vorgegebene Zeichen für Listentrennung. Auch ist zu beachten, dass Access im Abfragetext die Namen der eingebauten (access-internen) Funktionen, wie auch einige Parameterwerte "eindeutscht". Daher sollte das Maß aller Dinge nicht der Abfrageentwurf, sondern die daraus resultierende SQL-Anweisung sein.