Makros im Griff per VBA

Zusammenfassung

Erfahren Sie, wie Sie per VBA auf Makros zugreifen, um diese etwa zu dokumentieren, zu erstellen oder anzupassen.

Techniken

Makros, VBA

Voraussetzungen

Access 2000 und höher

Beispieldatenbank

Macroworks00.mdb

Sascha Trowitzsch, Berlin

Wenn Sie Datenbanken von anderen Entwicklern oder aus früheren Schaffensperioden warten oder überarbeiten möchten, stoßen Sie möglicherweise auf Makros. Diese wollen dokumentiert und gegebenenfalls nachbearbeitet werden. Das eine ließe sich mit dem Datenbank-Dokumentierer von Access erledigen, dessen Ausgabe sich aber leider nur auf einen generierten Bericht beschränkt, das andere mit dem Makro-Editor, der sich bisweilen aber als wenig komfortabel erweist. Sollten Sie nun auf die Idee kommen, selbst Routinen zur Dokumentation oder Bearbeitung von Makros zu programmieren, finden Sie hier das richtige Know-how.

Gehen wir von der Annahme aus, dass Sie einen Datenbank-Dokumentierer programmieren möchten, wie ihn Access im Prinzip bereits mitbringt (Extras/Analyse/Dokumentierer). Die Dokumentation wird von ihm als Access-Bericht erstellt, wobei die Darstellung deutlich zu wünschen übrig lässt. Schöner wäre es, wenn man eine Ausgabe der Dokumentation zum Beispiel in ein Word-Dokument erhielte, um sie anschließend formatieren zu können.

Datenbankobjekte auslesen

Die Technik zum Auslesen aller Datenbank-Objekte ist immer ähnlich: Dies lässt sich über die Containers- und Documents-Auflistung des Database-Objects von Access realisieren. Zu jeder Objektart gibt es einen Container. Für Formulare etwa wäre das die Auflistung Database.Containers(“Forms”).Documents. Für Makros lautet die Auflistung Database.Containers(“Scripts”).Documents.

Mit der For Each-Schleife aus Quellcode 1 erhalten Sie die Objektenamen der Elemente dieser Auflistung.

Kennt man einmal die Namen der Objekte, dann kann man im nächsten Schritt auch deren einzelne Eigenschaften ermitteln. Formulare beispielsweise lassen sich VBA im Entwurf öffnen; anschließend stehen die Eigenschaften zum Auslesen bereit. Daneben bietet das Access-Objektmodell zu jeder Objektart auch eine Auflistung: Für Formulare die Forms-Auflistung, für Berichte die Reports-Auflistung, für Tabellen die TableDefs, für Abfragen die QueryDefs, und so weiter.

Bild 1: Formular Makroassinent der Beispieldatenbank

Quellcode 1: Documents-Auflistung für den Datenbank-Container Forms durchlaufen

Sub ShowFormNames()
    Dim dbs As Database
    Dim oDoc As DAO.Document
    Set dbs = CurrentDb
    For Each oDoc In _        dbs.Containers("Forms").Documents
        Debug.Print oDoc.Name
    Next oDoc
End Sub

Nur eine Auflistung für Makros sucht man vergeblich. Es gibt leider keine und es gibt folglich auch kein Macro-Objekt. Es sieht danach aus, als könne man Makros nicht per VBA dokumentieren.

Da Microsoft es jedoch mit dem eingebauten Dokumentierer vormacht, muss es doch eine Möglichkeit geben – schließlich sind alle Assistenten und eingebauten Tools von Access selbst in Access und VBA programmiert. (Diese befinden sich unter anderem in der eingeklinkten Addin-Datenbank acwztool.mde im Office-Verzeichnis.)

Nachforschungen, wie an die Makros per VBA heranzukommen wäre, führen zur versteckten WizHook-Klasse von Access.

Zunächst stellen wir jedoch den in der Beispieldatenbank enthaltenen Makroassistent (frmMakroassistent) vor, der die nachfolgend betrachteten Routinen zur Dokumentation und Bearbeitung von Makros implementiert.

Mit dem Makroassistent aus Bild 1 lassen sich die Makros einer Datenbank auslesen, bearbeiten und neu erstellen.

Grundlegende Funktionen

Ein Kombinationsfeld im Formularkopf listet alle Makros der Datenbank auf. Bild 1 zeigt beispielsweise AutoKeys-Makro an. Nach der Auswahl findet man im Detailbereich je eine der im Makro enthaltenen Anweisungen. Der Assistent zeigt diese also nicht in einer Liste an. Mit den Navigations-Buttons links unten kann man in den enthaltenen Makro-Anweisungen blättern.

Die Schaltfläche Löschen dient zum Entfernen eines Makros aus der Datenbank – natürlich nicht, ohne zuvor eine Löschbestätigung einzuholen.

Ein Klick auf Neu… fördert ein Eingabefenster zutage, in das man den Name eines neu anzulegenden Makros eingeben kann. Das Makros wird dann in der Datenbank erstellt und im Datenbankfenster markiert. Danach kann man unmittelbar mit der Eingabe der Aktionen für dieses Makro im Detailbereich beginnen. Gleichzeitig wird die Schaltfläche Speichern aktiv. Wird sie betätigt, schreibt der Assistent alle im Detailbereich angegebenen Aktionen in das neue Makro. (Ein Klick auf den “OK”-Button schließt das Formular lediglich, speichert das Makro aber nicht!)

Auf diese Weise lassen sich auch vorhandene Makros bearbeiten. Sie können also Anweisungen und Argumente überschreiben oder neue mit über die Schaltfläche Neue Aktion hinzugefügen. Der Assistent bietet den Vorteil, dass man mehrere Makros hintereinander bearbeiten oder anlegen kann, ohne diesen zu verlassen, wie es beim eingebauten Access-Makro-Editor der Fall ist.

Die Schaltfläche Doku-Text erzeugt eine Dokumentation des gerade aktiven oder aller in der Datenbank enthaltenen Makros (siehe Bild 2).

Bild 2: Einzelnes oder alle Makros mit dem Assitenten dokumentieren

Diese Dokumentation wird als Datei macrodoc.txt im Anwendungsverzeichnis ausgegeben und anschließend automatisch in Notepad angezeigt. Die Schaltfläche ruft dazu die Prozedur DocumentMacros() im Modul mdlMacros auf.

Das ist wohl auch jene Prozedur, die Sie am meisten interessieren dürfte, falls Sie einen eigenen Dokumentierer realisieren möchten. Die Prozedur erwartet den Namen des zu analysierenden Makros. Bei einem Aufruf ohne diesen Parameter dokumentiert diese Funktion alle Makros der Datenbank.

Makroargumente bearbeiten

Das Bearbeiten der Makroargumente erfolgt im Detailbereich des Formulars. Auf der linken Seite kann man in einem Kombinationsfeld die Anweisung für die Aktion auswählen. (Die Datenquelle für dieses Kombinationsfeld ist die Tabelle tblMacroActions.)

Weiterhin kann man Angaben zu Kommentar, Bedingung und Makrogruppe der Aktion machen. Die hier möglichen Angaben entsprechen exakt denen, die Sie auch im Makro-Editor von Access vornehmen würden (siehe Bild 3).

Bild 3: Angaben zur Makro-Aktion

Sobald im Kombinationsfeld eine Anweisung ausgewählt wird, ändert sich die rechte Seite des Detailbereichs, der die Argumente der Aktion anzeigt. Abhängig von der vorgesehenen Anzahl von Argumenten werden entsprechende Textfelder und/oder Kombinationsfelder sichtbar (siehe Bild 4).

Bild 4: Argumente der Makro-Aktion

Wie das funktioniert, wird beim Betrachten der Ereignisprozedur Nach Aktualisierung des Kombinationsfelds Aktion deutlich (cbAction_AfterUpdate).

Dort wird die Sichtbarkeit von bereits im Formular anlegten Text- und Kombinationsfeldern in Abhängigkeit von der Anweisung (ActionID) gesteuert, wobei die Informationen darüber aus der Tabelle tblMacroArguments stammen. Im Entwurf des Formulars sind zunächst keine Textfelder in diesem Bereich sichbar. Das liegt daran, dass die Kombinationsfelder und Textfelder übereinander liegen (siehe Bild 5).

Bild 5: übereinander gestapelte Kombinations- und Textfelder in frmMakroassitsent

In der Prozedur wird zudem die Datenherkunft der Kombinationsfelder für die Argumente eingestellt. Es führt an dieser Stelle zu weit, die Funktionsweise genauer zu beschreiben. (Das gilt auch für weiteren Code der Beispieldatenbank. Wollte man alle der nicht ganz trivialen Prozeduren und die Interna von Access-Makros genau erläutern, so ließe sich damit gut und gerne ein komplettes Heft füllen. Wer also die Prozeduren für eigene Zwecke verwenden möchte, der kommt um ein Studium des Codes, der allerdings hinreichend kommentiert ist, nicht herum.)

Nachdem Sie die notwendigen Argumente für eine Makroanweisung eingegeben haben, können Sie über die Schaltfläche Neue Aktion die nächste Anweisung anlegen, oder, so vorhanden, mit der rechten Navigationsschaltfläche zur nächsten springen. Zum Schluss betätigen Sie die Speichern-Schaltfläche. Das ist wichtig, denn falls Sie im Makro-Kombinationsfeld im Kopfbereich ein neues Makro auswählen, gehen sonst sämliche Einstellungen des aktuellen Makros verloren.

Eine Aktion innerhalb eines Makro lässt sich übrigens einfach löschen, indem sie Sie auf den Datensatzmarkierer klicken und die Taste ENTF betätigen.

Sie können diesen Assistenten nun einfach benutzen oder ihn als Grundlage für eigene Entwicklungen verwenden. In diesem Fall, oder wenn Sie verstehen möchten, was sich hinter ihm verbirgt, sollten Sie sich die folgenden Absätze zu Gemüte führen, die die Funktionsweise verdeutlichen.

Makros haben die folgenden Eigenschaften:

  • Ein Makro hat einen Namen, der in der Documents-Auflistung des Datenbank-Containers Scripts enthalten ist.
  • Es enthält eine Folge von Anweisungen, die genau den DoCmd-Methoden von Access entsprechen. Bei Makros heißen diese Anweisungen Aktionen (actions).
  • Eine Anweisung kann einen Gruppennamen zugewiesen bekommen. Wird dieser Gruppenname zusätzlich zum Makronamen, zum Beispiel in einem Ereignis, angegeben, dann werden alle Anweisungen nur dieser Gruppe ausgeführt (MakroXY.Gruppe1).
  • Eine Anweisung kann einen Kommentar enthalten. Einer Anweisung kann eine Bedingung vorgegeben werden. Nur wenn diese erfüllt ist, wird die Anweisung ausgeführt.
  • Eine Anweisung kann einen variablen Satz von (optionalen) Parametern enthalten, der auch aus der Syntax der analogen Docmd-Methode hervorgeht. Bei Makros werden diese nicht als Parameter, sondern als Argumente bezeichnet.
  • Ein Argument kann intern ein String sein oder eine Zahl, die als ID einen Eintrag aus einer vorgegebenen Parameterliste identifiziert. Letztere wird im Makro-Editor als Kombinationsfeld angezeigt. (Zu sehen ist in diesen Kombinationsfeldern jeweils nur der Texteintrag. Die dahinter liegende Zahl, das eigentliche Argument, bleibt verborgen.)
  • Dieser Aufbau spiegelt sich in zwei Tabellen der Beispieldatenbank Macrowork00.mdb wieder.

    Die Tabelle tblMacroActions enthält alle möglichen Anweisungen. Das Feld ActionName zeigt die eingedeutschten Namen der Anweisungen. Die Spalte ActionID ist kein Autowert, sondern ein internes Token, das die Anweisung für Access identifiziert. Diese Action-IDs sind zentral und es wird in den Modulen der Datenbank viel damit hantiert. Die letzte Spalte CountOfArguments gibt an, wie viele Parameter die Anweisung erwartet. Die meisten dieser Argumente sind allerdings optional.

    Die Tabelle tblMacroArguments ist eine Detailtabelle, die die Argumente zu den einzelnen Anweisungen der Tabelle tblMacroActions auflistet. Die beiden sind wie in Bild 6 miteinander verknüpft.

    Bild 6: Tabellen und Beziehungen des Makroassistenten

    In der Tabelle tblMacroArguments bezeichnet das Feld Argument den Namen eines Parameters. ColID ist die Nummer der Parameterzeile in der Reihenfolge, wie sie auch im Makro-Editor erscheint. ComboType gibt an, um welche Art von Parameter es sich handelt. Eine 0 entspricht dabei einen String. Eine 1 oder eine 8 entspricht hier, dass es sich um eine Auswahl (Kombinationsfeld) handelt.

    In diesem Fall stehen in der Spalte ComboString die zur Auswahl stehenden Argumente als semikolonseparierter String. Ein Spezialfall ist der ComboType 9, der nur bei der Anweisung AusführenBefehl (RunCommand) vorkommt.

    Eine Liste aller möglichen RunCommand-Konstanten und deren Namen findet sich in der Hilfstabelle tblRunCommands12. Neben dem Konstantenwert ID steht in deren Feld Command der Name der Konstante neben der Access-Version, in der sie verfügbar ist.

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar