Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2006.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

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

Makros im Griff per VBA

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.

Makros in Access und VBA

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.

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

Makroassistent per VBA

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

Grundlegende Funktionen

Ein Kombinationsfeld im Formularkopf listet alle Makros der Datenbank auf. Abb. 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 (s. Abb. 2).

Abb. 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 (s. Abb. 3).

Abb. 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 (s. Abb. 4).

Abb. 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 (s. Abb. 5).

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

Interner Aufbau von Makros

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.)
  • Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.