Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Zusammenfassung
Lernen Sie fortgeschrittene Techniken mit Makros kennen.
Techniken
Makros
Voraussetzungen
Access 97 und höher
Beispieldatenbank
Makros97.mdb, Makros00.mdb
Martin Hoffmann, Düsseldorf
Nach den Grundlagen im ersten Teil dieser Beitragsreihe legen Sie nun richtig los: Am Beispiel eines Formulars zur Eingabe von Kundendaten erfahren Sie, wie Sie Makros verschiedenen Ereignissen zuweisen, wie Sie Bedingungen in Makros unterbringen und wie Sie die Befehle eines Makros auf mehrere Makros aufteilen.
Eine wichtige Aufgabe von Makros ist das Auslesen und Verändern von Feldinhalten. Auf diese Weise können Werte kopiert, initialisiert oder umgewandelt werden.
Im folgenden Beispiel erstellen Sie ein Makro, welches im Kundenformular frmKunden die Telefonnummer kopiert und diese dann im Feld Telefaxnummer speichert.
Dadurch ersparen Sie sich die erneute Eingabe der in vielen Fällen gleichen Nummer für Telefon und Fax. Ein Klick auf die Schaltfläche genügt.
Verweise auf Steuerelemente
Um innerhalb eines Makros den Inhalt des Feldes Telefonnummer auslesen zu können, müssen Sie einen Verweis auf dieses Steuerelement erstellen. Die Syntax eines solchen Verweises lautet in der Kurzform:
Formulare!<Formularname>!<Steuerelementname>
Diesen vollständigen Verweis müssen Sie angeben, wenn Sie von außerhalb des Formulars auf Steuerelemente zugreifen möchten. Im Beispiel soll die Schaltfläche zum Kopieren der Telefonnummer jedoch im Kundenformular platziert werden. Es reicht deshalb aus, den Namen des Steuerelements anzugeben. Als Formularname wird automatisch das Formular eingesetzt, von dem aus das Makro aufgerufen wird. Der Verweis lautet also lediglich:
<Steuerelementname>
Erstellen der Schaltfläche
Im Abschnitt Erstellen eines Hauptmenüs des ersten Teils dieser Beitragsreihe (s. Shortlink 373) haben Sie zunächst ein Makro und anschließend per Drag-and-Drop die entsprechende Schaltfläche im Formular angelegt. Zum Erstellen der Schaltfläche im Kundenformular gehen Sie den umgekehrten Weg.
Bild 1: Legen Sie eine Befehlsschaltfläche für das Makro an.
Sie fügen zuerst die Schaltfläche in das Formular ein und anschließend legen Sie über den Makro-Editor die Aktionen fest.
öffnen Sie das Kundenformular in der Entwurfsansicht. Das Formular enthält ein Register, in dem die Kundendaten übersichtlich gruppiert sind.
Im zweiten Registerblatt finden Sie die Telefon- und Telefaxnummer. Hier ist der richtige Platz für die Schaltfläche. Klicken Sie auf das Register Kommunikation, um es zu aktivieren und die Steuerelemente sichtbar zu machen.
öffnen Sie nun die Toolbox über das gleichnamige Symbol in der Symbolleiste und legen Sie im Register eine neue Befehlsschaltfläche rechts neben der Telefaxnummer an (siehe Bild 1).
Geben Sie nun der Befehlsschaltfläche im Eigenschaftsfenster den Namen btnTelefonübernehmen. Als Beschriftung tragen Sie Telefonnummer übernehmen ein.
Anlegen des Makros
Die Telefonnummer soll bei einem Klick auf die Schaltfläche in das Telefaxfeld kopiert werden.
Sie benötigen also eine Verknüpfung des Makros mit der Eigenschaft Beim Klicken der Schaltfläche. Aktivieren Sie im Eigenschaftsfenster der Schaltfläche das Register Ereignis und klicken Sie auf die Editor-Schaltfläche rechts neben der Eigenschaft Beim Klicken (siehe Bild 2).
Im folgenden Dialog wählen Sie den Makro-Generator aus der Liste und bestätigen mit OK (siehe Bild 3).
Access öffnet dann sofort ein neues, leeres Makrofenster und fordert Sie zur Eingabe eines Namens auf, unter dem es das Makro speichert. Geben Sie den Namen makTelefonübernehmen ein.
Bild 2: So rufen Sie den Dialog zur Auswahl des Makro-Generators auf.
Bild 3: Wählen Sie den Generator aus.
Eingeben der benötigten Aktionen
Das Makro ist jetzt für die Eingabe der Aktionen bereit. Da Sie den Inhalt des Feldes Telefaxnummer verändern müssen, ist die erste Aktion die SetzenWert-Aktion. Damit weisen Sie einem Feld einen Ausdruck zu. Dies kann eine Berechnung, eine fester Wert oder wie in diesem Fall der Inhalt eines anderen Feldes sein.
Bild 4: Kopieren Sie Daten mit der SetzenWert-Aktion.
Bild 5: Sie aktualisieren Felder mit der Aktion AktualisierenDaten.
Bild 6: So funktioniert das übernehmen der Telefonnummer per Knopfdruck.
Wählen Sie die SetzenWert-Aktion aus der Liste aus und tragen Sie im Argument Feld den Ausdruck TelefaxGeschäftlich ein.
Da Sie das Makro vom Formular Kunden aus aufrufen, bezieht sich der relative Verweis auf das Steuerelement dieses Formulars. Würde die Schaltfläche beispielsweise in einem anderen Formular liegen, müssten Sie den vollständigen Ausdruck Formulare!frmKunden!TelefaxGeschäftlich angeben.
Hinweis
Achten Sie bei der Eingabe von Feldnamen in Ausdrücken darauf, dass diese in eckige Klammern gesetzt werden müssen, wenn sie Sonderzeichen enthalten. Zum Beispiel werden [Kunden-Nr] oder [Kunden Nummer] ohne eckige Klammern von Access nicht oder falsch interpretiert. In der Beispieldatenbank Makros.mdb kommen deshalb in keinem Feldnamen Sonderzeichen vor – ein Problem weniger, auf das Sie achten müssen. Außerdem setzt Access Feldnamen ohne Sonderzeichen automatisch in eckige Klammern, wie in Bild 4 zu sehen ist.
Der Wert, den das Feld erhalten soll, steht im Steuerelement TelefonGeschäftlich des gleichen Formulars. Geben Sie diesen Namen im Parameter Ausdruck an.
Damit nach dem Kopieren der neue Inhalt des Feldes TelefaxGeschäftlich sichtbar wird, müssen Sie das Feld noch aktualisieren. Dies geschieht mit der Aktion AktualisierenDaten. Als Steuerelementnamen tragen Sie im gleichnamigen Aktionsargument TelefaxGeschäftlich ein (siehe Bild 5).
Sichern Sie die änderungen am Makro mit dem Menübefehl Datei/Speichern. Beim Schließen des Makros trägt Access automatisch den zuvor gegebenen Makronamen in der Eigenschaft BeimKlicken der Schaltfläche ein.
Um die neue Funktion auszuprobieren, wechseln Sie in die Formularansicht und aktivieren das Register Kommunikation. Legen Sie zu Testzwecken einen neuen Kunden an und geben Sie eine Telefonnummer ein. Klicken Sie anschließend auf die Schaltfläche Telefonnummer übernehmen. Die Telefonnummer erscheint dann im Feld Telefax geschäftlich (siehe Bild 6).
Bild 7: Die Spalte Bedingung wird eingeblendet.
Einen Nachteil hat das Makro jedoch. Wenn im Feld Telefaxnummer bereits ein Eintrag vorhanden ist, wird dieser beim Ausführen des Makros überschrieben. Im folgenden Abschnitt wird Ihnen deshalb eine verbesserte Version vorgestellt, bei der eine Sicherheitsabfrage vor versehentlichem überschreiben schützt.
Normalerweise werden alle Aktionen eines Makros von oben nach unten abgearbeitet. Um eine bedingte Ausführung von Makro-Aktionen zu realisieren, stellt das Makrofenster die Spalte Bedingung zur Verfügung. Sie blenden die Spalte über das gleichnamige Symbol in der Symbolleiste oder über den Menübefehl Ansicht/Bedingungen ein (siehe Bild 7).
In dieser Spalte können Sie zu jeder Aktion einen Ausdruck eingeben. Wenn Sie das Makro starten, wird zunächst der Ausdruck ausgewertet. Ergibt der Ausdruck den logischen Wert Wahr, führt Access die Aktion aus. Ist das Ergebnis des Ausdrucks Falsch, wird die Aktion übersprungen.
Damit Access den Ausdruck auswerten kann, muss dieser eine ganz bestimmte Form haben. Sie können nicht einfach einen Text oder Zahlen als Ausdruck eingeben. Das Ergebnis des Ausdrucks muss entweder den Wert Wahr oder Falsch haben. Sie müssen folglich logische Ausdrücke in die Spalte Bedingung eintragen. Dies ist in den meisten Fällen ein Vergleich. So kann zum Beispiel der Ausdruck
[Rechnungsdatum]<Datum()
je nach Tagesdatum den Wert Wahr oder Falsch annehmen.
Als Bedingung können Sie außerdem Funktionen eingeben, die Bool”sche Werte Wahr oder Falsch zurückliefern.
Im Zusammenhang mit Steuerelementen hat die Funktion IstNull eine besondere Bedeutung.
Damit können Sie überprüfen, ob ein Steuerelement einen Feldinhalt hat. Für das Beispiel mit der Telefaxnummer lautet der Ausdruck:
IstNull([TelefaxGeschäftlich])
Das Ergebnis lautet Wahr, wenn keine Telefaxnummer eingetragen ist, anderenfalls lautet das Ergebnis Falsch.
Makro anpassen
Nehmen Sie nun die Veränderungen am Makro makTelefonübernehmen vor. Führen Sie dazu die folgenden Schritte aus:
Die Bedingung wirkt sich nur auf die erste Aktion aus. Ist das Feld TelefaxGeschäftlich leer, wird die Telefonnummer eingesetzt. Steht bereits eine Faxnummer in diesem Feld, wird sie nicht überschrieben.
Bild 8: Dies ist ein verbessertes Makro mit Bedingung.
Die Aktion AktualisierenDaten wird im Moment immer ausgeführt. Dies ist aber überflüssig, wenn sich der Wert im Feld Telefaxnummer nicht ändert. Damit das Makro diese Aktion nur zusammen mit der Aktion SetzenWert ausführt, könnten Sie der Zeile die gleiche Bedingung voranstellen.
Das bedeutet aber nicht nur mehr Schreibarbeit, sondern kann auch zu ungewollten Aktionsabläufen führen, wenn sich der abgefragte Wert während der Ausführung des Makros ändert.
Um eine Bedingung auf mehrere Aktionen anzuwenden, tragen Sie bei der ersten Aktion die Bedingung ein. Allen folgenden Aktionen, die bei erfüllter Bedingung mit ausgeführt werden sollen, stellen Sie drei Punkte (…) als Bedingung voran.
Auf diese Weise definieren Sie einen Aktionsblock. Alle Aktionen dieses Blocks werden nacheinander ausgeführt, wenn die Bedingung erfüllt ist. Sie werden übersprungen, wenn diese nicht zutrifft.
Alle auf den Anweisungsblock folgenden Aktionen ohne drei vorangestellte Punkte werden wieder unabhängig vom Ergebnis der Bedingung ausgeführt. Das fertige Makro hat den in Bild 8 dargestellten Aufbau.
Um das Makro zu testen, öffnen Sie das Kundenformular in der Entwurfsansicht und wählen bei der Eigenschaft Beim Klicken der Schaltfläche btnTelefonübernehmen das Makro mit der Bezeichnung makTelefonübernehmen_verbessert aus. Wenn Sie in der Formularansicht auf die Schaltfläche klicken und es existiert bereits eine Faxnummer, passiert nichts und die Nummer bleibt erhalten.
Eine weitere Verbesserung des Makros erreichen Sie, indem Sie eine Benutzerrückfrage einbauen. über ein Meldungsfenster entscheidet dann der Benutzer, ob eine eingetragene Faxnummer überschrieben werden soll. Bestätigt er den Dialog mit Ja, wird überschrieben, klickt er auf Nein, bleibt die alte Nummer erhalten.
Es handelt sich hierbei also nicht um eine einfache Bedingung, sondern um eine Bedingung Wenn-Dann-Sonst. Es müssen zwei Aktionsblöcke mit einer Bedingung gesteuert werden.
Ist die Bedingung erfüllt, führt das Makro den ersten Aktionsblock aus. Ist die Bedingung nicht erfüllt, wird der zweite Aktionsblock abgearbeitet.
Um die zwei Aktionsblöcke voneinander abzugrenzen, stellt Access die Aktion StopMakro bereit. Mit dieser Aktion wird die Ausführung eines Makros sofort beendet. In Tab. 1 ist beispielhaft eine Beziehung Wenn-Dann-Sonst allgemein dargestellt.
Spalte “Bedingung” |
Spalte “Aktion” |
<Bedingungs-Ausdruck> |
Aktion 1 |
… |
Aktion 2 |
… |
Aktion 3 |
… |
StopMakro |
Aktion 4 |
|
Aktion 5 |
Tab. 1: So sieht ein Wenn-Dann-Sonst-Makro aus.
Ist der Bedingungs-Ausdruck erfüllt, werden die Aktionen 1 bis 3 ausgeführt und anschließend das Makro mit der StopMakro-Aktion beendet. Ist die Bedingung nicht erfüllt, überspringt das Makro die vorherigen Aktionen, führt nur die Aktionen 4 und 5 aus und beendet dann das Makro regulär.
Der zweite Anweisungsblock wird im oben beschriebenen Fall immer ausgeführt, wenn die Bedingung nicht erfüllt ist. Im Beispiel der Telefaxnummer ist dies der Fall, wenn bereits eine Nummer eingetragen ist.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo