Makros in Access 2007

15.12.2006 von André Minhorst
Microsoft will den Einstieg in Access erleichtern. Dafür sorgt das Unternehmen nicht nur mit vielen Datenbankvorlagen und Assistenten, sondern auch durch eine Aufwertung von Makros als Mittel zur Automatisierung. Im vorliegenden Artikel erfahren Sie, was es im Zusammenhang mit Makros Neues gibt.

Makros ermöglichen unerfahrenen Entwicklern die rudimentäre Programmierung von Access. Rudimentär deshalb, weil Makros bis Version 2003 gegenüber VBA einige Nachteile haben: Sie lassen sich schlecht debuggen, erlauben keine Fehlerbehandlung, und auch die Programmierung von Strukturen wie in VBA ist kaum möglich. Weitere Nachteile sind die schlechte Wartbarkeit sowie das Fehlen von Variablen zum Zwischenspeichern von Werten.

Access 2007 erweitert die Möglichkeiten von Makros erheblich. Der Grund: Die neue Access-Version soll auch für Einsteiger wesentlich einfacher zu handhaben sein – und das betrifft neben der benutzerfreundlichen Oberfläche auch die Programmierbarkeit. Die neuen Features der Makros lassen den Benutzer wesentlich mehr mit Access anstellen, bevor er sich irgendwann doch mit VBA auseinandersetzen muss.

Makros statt VBA?

Microsoft scheint eine Menge Wert auf die neuen Makro-Möglichkeiten zu legen: Immerhin sollen etwa die Datenbankvorlagen komplett auf VBA verzichten und lediglich eingebettete Makros zum Implementieren der notwendigen Funktionalität verwenden.

Was aber sind „eingebettete Makros“? Bis Access 2003 konnte man Makros lediglich über den passenden Editor erstellen und sie unter einem bestimmten Namen speichern. Der Aufruf erfolgte dabei über das Angeben des Makronamens als Wert einer Ereigniseigenschaft (Bild 1). Das Anlegen, Bearbeiten und Löschen von Makros wurde dabei ausschließlich über das Datenbankfenster initiiert.

Bild 1: Eingebettete Makros lassen sich nur über die passende Ereigniseigenschaft öffnen.

Eingebettete Makros sind – bezogen auf die Art des Anlegens – mit den für Daten- und Datensatzherkünfte über die entsprechende Eigenschaft angelegten Abfragen vergleichbar: Sie lassen sich direkt vom Eigenschaftsfenster aus anlegen und auch ausschließlich von dort öffnen. Im Navigationsbereich (ehemals Datenbankfenster) sind die Makros nicht mehr zu finden.

Bild 2: Ein Makro im neuen Makro-Editor.

Genau wie die Abfragen bei Daten- und Datensatzherkünften lassen sich allerdings auch eingebettete Makros mit einem Namen versehen und speichern, damit man sie über den Navigationsbereich starten, öffnen oder löschen kann. Der Makro-Editor ähnelt dem von Access 2003 und älter (Bild 2). Mit den neuen Funktionen befasst sich dieser Artikel weiter unten.

Vorsicht, Makro!

Die Vorgehensweise an sich ist nicht gerade revolutionär und birgt überdies einen großen Nachteil gegenüber dem Einsatz von VBA-Ereignisprozeduren: Während man die zu einem Formular oder Bericht gehörenden VBA-Ereignisprozeduren übersichtlich im Codefenster einsehen kann, kann man sich zur selben Zeit nur ein Makro ansehen. Schuld daran ist der neue Makro-Editor, der stets als modaler Dialog geöffnet wird und noch nicht einmal die Möglichkeit bietet, andere Objekte zu öffnen – der dazu notwendige Navigationsbereich wird schlichtweg deaktiviert.

Ein weiteres Manko ist, dass gespeicherte und im Navigationsbereich sichtbare Makros von dort per Doppelklick gestartet werden können. Im Gegensatz zu einer VBA-Prozedur, die man explizit über ein entsprechendes Ereignis, beim Debuggen über oder das Direktfenster aufruft, reicht hier ein Mausklick, um beispielsweise ein Makro zum Löschen von Daten auszulösen.

Vorteil Makro

Wer Steuerelemente wie etwa Schaltflächen oder Textfelder mit VBA-Ereignissen kopieren möchte, um sie entweder im gleichen oder einem anderen Formular zu reproduzieren, muss sich auf Zusatzaufwand gefasst machen: VBA-Prozeduren, die durch Ereignisse ausgelöst werden, kopiert Access nicht mit. Genau genommen leert es beim Kopieren sogar die passenden Ereigniseigenschaften. Dies hat Microsoft bei der Verwendung eingebetteter Makros besser gelöst: Diese werden komplett mit kopiert. Das Gleiche gilt für das Löschen von Steuerelementen mit eingebetteten Makros: Sie verschwinden mit den Steuerelementen und verbleiben nicht – wie bei VBA – als unnötiger Ballast im jeweiligen Modul.

Bild 3: Warum kann man Makros trotz höchster Sicherheit problemlos aufrufen?

Der zweite Vorteil ist, dass Makros nie als sicherheitskritisch erachtet werden und dementsprechend selbst bei höchster Sicherheit ohne Rückfrage aufgerufen werden können. Bei Access-Neulingen und weniger erfahrenen Benutzern dürfte die inkonsequente Verwendung der Bezeichnung „Makro“ allerdings für Verwirrung sorgen. Die Sicherheitseinstellungen aus Bild 3 etwa deuten darauf hin, dass Access keinerlei Makros ausführen dürfte – damit sind allerdings nicht die soeben beschriebenen Makros, sondern VBA-Routinen gemeint. Der Hintergrund ist, dass Microsoft VBA-Routinen unter Word oder Excel den Namen Makro verpasst, unter Access aber diesen Namen für einen speziellen Objekttyp reserviert hat.

Alte und neue Makrobefehle

Ein Vergleich der alten und neuen Makrobefehle bringt Überraschendes zu Tage. Die neu hinzugekommenen Befehle sind im Kasten in alphabetischer Reihenfolge aufgelistet.

Weggefallen sind – und das ist überraschend – eine ziemlich große Menge von Anweisungen. Die Liste im zweiten Kasten resultiert aus einem Vergleich der entsprechenden Bibliotheken von Access 2003 und Access 2007 Beta 2 Technical Refresh.

Das Wegfallen von AusführenAnwendung oder AusführenSQL hängt wohl damit zusammen, dass Makros absolut sicher sein sollen – was nicht der Fall wäre, wenn man damit gefährlichen Code in SQL-Anwendungen aufrufen könnte. Gleiches gilt für die Befehle zum Aufrufen von Modulen & Co. Man kann allerdings weiterhin mit AusführenCodeVBA-Routinen ausführen oder mit ÖffnenFormular Formulare öffnen, die über Ereignisse wie Beim Öffnen wiederum VBA-Code ausführen können. Das Wegfallen anderer Makrobefehle scheint allerdings nicht logisch.

Bild 4: Die VBA-Varianten der in Access 2007 weggefallenen Makrobefehle sind noch vorhanden.

Wer sich ein wenig mit Access auskennt, der weiß, dass die meisten Makrobefehle als Methode der DoCmd-Klasse auch per VBA aufgerufen werden können. Ein Blick in den Objektkatalog zeigt, dass die Pendants der weggefallenen Makrobefehle noch als DoCmd-Methode vorhanden sind (Bild 4).

Aus alt mach neu

Auch wenn einige Makros offenbar nicht mehr Bestandteil von Access sind, brauchen Sie sich keine Sorge um die Funktion von bestehenden Makros zu machen: Wie Bild 5 zeigt, erkennt Access 2007 ältere Makrobefehle durchaus noch, versieht sie jedoch mit einem Ausrufezeichen und verhindert ihre Neuanlage.

Bild 5: Makrobefehle aus älteren Anwendungen können in Access 2007 zwar noch ausgeführt, aber nicht mehr neu angelegt werden.

Der Vollständigkeit halber finden Sie in der nachfolgenden Liste noch die zu den neuen Makrobefehlen passenden DoCmd-Methoden.

Neue Makrobefehle

BeiFehler

EntfernenAlleTempVar

EntfernenTempVar

FestlegenAngezeigteKategorien

FestlegenEigenschaft

FestlegenTempVar

MakroEinzelschritt

NavigierenZu

SchließenDatenbank

SpeichernNavigationsbereich

SuchenNachDatensatz

Die weggefallenen Makrobefehle

AusführenAnwendung

ÖffnenGespeicherteProzedur

AusführenSQL

ÖffnenModul

Drucken

ÖffnenSicht

Echo

SetzenWert

EinblendenSymbolleiste

Speichern

GeheZuSteuerelement

Tastaturbefehle

KopierenDatenbankdatei

TransferArbeitsblatt

KopierenObjekt

TransferDatenbank

LöschenObjekt

TransferSQLDatenbank

ÖffnenDatenzugriffsseite

TransferText

ÖffnenDiagramm

UmbenennenObjekt

ÖffnenFunktion

Warnmeldungen

Der Makrobefehl AusführenBefehl liefert eine ganze Reihe neuer Konstanten, während keine der bestehenden Konstanten weggefallen ist. Zwar sind einige Konstanten nicht mehr via IntelliSense verfügbar, aber dennoch vorhanden: Das scheinbare Fehlen resultiert daraus, dass Microsoft die Konstanten aus Kompatibilitätsgründen noch mitführt. Wenn Sie im Objektkatalog die Option Verborgene Elemente anzeigen aus dem Kontextmenü der einzelnen Elemente aktivieren, erscheinenden die fehlenden Einträge in hellgrauer Schrift. Die Auflistung der Änderungen würde allerdings den Rahmen dieses Artikels sprengen. Eine Übersicht aller Unterschiede der Access-Bibliotheken von Access 2003 und Access 2007 finden Sie unter www.access-im-unternehmen.de/a2007 .

Makro per Assistent

Access liefert einen Assistenten für das Erstellen einiger Steuerelemente, so etwa für Schaltflächen. Damit er seinen Dienst verrichtet, muss die passende Schaltfläche während des Entwurfs aktiviert sein (Bild 6).

Bild 6: Aktivieren des Assistenten für das Erstellen von Steuerelementen.

Wenn Sie den Assistenten verwenden möchten, um schnell rudimentäre Funktionen einzufügen (der Assistent bietet einige davon, wie Bild 7 zeigt), rechnen Sie möglicherweise damit, dass er die passenden Codezeilen in eine Ereignisprozedur eines VBA-Moduls schreibt – genau so, wie es bis Access 2003 stets der Fall war.

Bild 7: Der Befehlsschaltflächen-Assistent bietet einige grundlegende Funktionen an.

Aber weit gefehlt: Access 2007 erstellt ein eingebettetes Makro für die neue Schaltfläche (Bild 8). Wer also auf einen VBA-Code hofft, den er später erweitern kann, wird enttäuscht. Andererseits zeigt der Vergleich mit dem von Access 2003 erzeugten Code für die gleiche Funktion (Listing 1), dass die VBA-Variante auch nicht unbedingt gut zu lesen ist. Wer aber flexibel sein möchte, arbeitet besser direkt mit einer selbst programmierten Routine.

Bild 8: Ein per Assistent erstelltes eingebettetes Makro.

Private Sub Befehl0_Click()
On Error GoTo Err_Befehl0_Click
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append
Exit_Befehl0_Click:
Exit Sub
Err_Befehl0_Click:
MsgBox Err.Description
Resume Exit_Befehl0_Click
End Sub

Gesperrt oder nicht gesperrt?

Weiter oben wurde erwähnt, dass Access Makros auch im abgesicherten Modus ausführen kann. Da man gegebenenfalls VBA-Code per Makro aufrufen möchte, sollte man prüfen, in welchem Zustand sich die Access-Datenbank befindet. Andernfalls sollte an den Benutzer informieren, dass der volle Funktionsumfang inklusive VBA erst nach dem Anpassen der Sicherheitsstufe oder nach dem Speichern
in einem vertrauenswürdigen Ordner zur Verfügung steht. Was es mit vertrauenswürdigen Ordnern auf sich hat, erfahren Sie in einer der folgenden Ausgaben von Expert´s inside Access.

Das Makro aus Bild 9 prüft, ob die aktuelle Anwendung vertrauenswürdig ist oder nicht, und gibt eine entsprechende Meldung aus.

Bild 9: Dieses Makro prüft, ob eine Datenbank vertrauenswürdig ist.

Fehlerbehandlung in Makros

Access 2007 liefert eine Fehlerbehandlung für Makros, die der für VBA recht ähnlich ist. Startpunkt für eine solche Fehlerbehandlung ist die Aktion Bei Fehler. Der einzige Parameter dieser Aktion kann drei Werte annehmen:

Bild 10: Wenn die Bedingung in der letzten Zeile auf einen Fehler hindeutet, löst dies eine entsprechende Meldung aus.

Bild 10 zeigt ein kleines Beispielmakro für den Einsatz der Fehlerbehandlung in Makros. Ausschalten lässt sich die Fehlerbehandlung im Übrigen mit der Makro-Aktion LöschenMakroFehler. Diese Aktion sorgt überdies für das Initialisieren des MakroError-Objekts.

Temporäre Variablen in Makros

Eine weitere interessante Neuerung im Bereich Makros sind temporäre Variablen. Mit der Makro-Aktion FestlegenTempVar legen Sie eine solche Variable fest: Der erste Parameter entspricht dabei dem Variablennamen, der zweite dem Wert der Variablen.

Innerhalb von Makros lässt sich der Wert einer auf diese Weise angelegten Variablen mit dem Ausdruck =TempVar("<Variablenname>") ermitteln. Bild 11 zeigt ein Beispielmakro, das zuerst eine Variable anlegt, sie per Meldungsfenster ausgibt, eine weitere Variable füllt und schließlich beide Variablen in einer VBA-Funktion ausgibt. Die passende Funktion finden Sie in Listing 2. Hier kommen das neue TempVar-Objekt von VBA sowie die passende Auflistung TempVars zum Einsatz.

Public Function VariableAusgeben()
Dim tv As TempVar
For Each tv In TempVars
Debug.Print tv.Name, tv.Value
Next tv
End Function

Bild 11: Der Inhalt temporärer Variablen lässt sich sowohl in Makros als auch in VBA-Funktionen weiterverarbeiten.

Wo stecken die eingebetteten Makros?

In Formulare und Berichte eingebettete Abfragen speichert Access wie „normale“ Abfragen ab, zeigt sie aber nicht im Datenbankfenster an. Einen Hinweis darauf gibt die Systemtabelle MSysObjects. Der Name einer im Formular frm BeispielMakro eingebetteten Abfrage lautet etwa „~sq_ffrmBeispielMakro“.

Eingebettete Makros werden anders gespeichert, und zwar zusammen mit der Definition des jeweiligen Formulars. An diese kommen Sie nur über die nicht dokumentierte und verborgene Methode SaveAsText des Application-Objekts heran. Listing 3 zeigt einen Auszug aus der Definition des Formulars mit der Beschreibung des Makros.

Begin CommandButton
OverlapFlags =85
Left =2324
Top =1814
Width =576
Height =576
Name ="Befehl1"
Caption ="Befehl1"
ControlTipText ="Datensatz duplizieren"
GUID = Begin
0x0aafbdb6a54ddd4599f0ab9a2e04efac
End
OnClickEmMacro = Begin
Version =196611
ColumnsShown =14
Begin
Action ="OnError"
Argument ="0"
End
Begin
Action ="RunCommand"
Argument ="50"
End
Begin
Condition ="[MacroError]=0"
Action ="RunCommand"
Argument ="190"
End
Begin
Condition ="[MacroError]=0"
Action ="RunCommand"
Argument ="28"
End
Begin
Condition ="[MacroError]=0"
Action ="RunCommand"
Argument ="50"
End
Begin
Condition ="[MacroError]=0"
Action ="RunCommand"
Argument ="191"
End
Begin
Condition ="[MacroError]<>0"
Action ="MsgBox"
Argument ="=[MacroError].[Description]"
Argument ="-1"
Argument ="0"
End
End

Zusammenfassung

Die neuen Möglichkeiten werten Makros erheblich auf. Dennoch decken Makros bei Weitem nicht die Möglichkeiten von VBA ab. Einsteiger, die Formulare und andere Elemente der Benutzeroberfläche mit überschaubaren Funktionen versehen möchten, wie etwa dem Öffnen weiterer Formulare oder dem Prüfen von Steuerelementen, können durchaus von Makros profitieren. Mit wachsender Komplexität erschlechtert sich die Wartbarkeit aber deutlich gegenüber der bei ordentlich strukturierten VBA-Prozeduren

Features wie die temporären Variablen ermöglichen das Zusammenspiel von Makros und VBA. Für den einen mag das ein Segen sein, etwa wenn man eine auf Makros aufbauende Datenbank um VBA-Funktionen erweitern möchte; andere sorgen mit einer bunten Mischung aus Makros und VBA-Routinen früher oder später für eine wartungsresistente Anwendung.