Erstellen von Makros in Word für Windows (Teil 2)
(
Gerd-Michael Sens, HRZ Gießen)Inhalt:
Im ersten Teil meines Beitrags über die Makroerstellung in WinWord (siehe LOGIN 96/4) beschrieb ich, wie Informationen während des Ablaufs eines Makros in Variablen "gespeichert" bzw. von "außen" eingegeben und nach "außen" hin angezeigt werden. Außerdem stellte ich einige einfache Kontrollanweisungen vor, mit deren Hilfe der Ablauf eines Makros gesteuert werden kann.
In diesem Teil möchte ich Ihnen zeigen, wie Sie WinWord-Anweisungen (z.B. Textbearbeitung, Menübefehle) in einem Makro verwenden können. Bevor es los geht, muß ich noch einen Hinweis zu den WinWord-Versionen geben, da etwa zur selben Zeit, wie dieser Artikel entstand, auf dem Software-Markt die Version WinWord 97 erschienen ist. In WinWord 97 wurde das Word-BASIC durch das Visual BASIC for Applications (VBA) ersetzt. Auch wenn diese Programmiersprache auf BASIC basiert, unterscheidet sie sich doch grundlegend von dem WordBASIC in den bisherigen WinWord-Versionen.
Dieser Artikel ist daher nur für diejenigen AnwenderInnen gedacht, die die WinWord-Versionen 6.0 bzw. 7.0 verwenden.
Einfache WinWord-Anweisungen in Makros
Von den inzwischen über 600 Makroanweisungen entfallen ca. 90% auf WinWord-Anweisungen. Zu praktisch jeder Aktion, sei es das Bewegen der Schreibmarke, das Kopieren von Text, das Wechseln einer Ansichtsform, das Erstellen einer Tabelle usw. gibt es entsprechende Befehle in WordBASIC. Selbst zum Erstellen und für den Ablauf von Makros existieren Befehle und Funktionen.Nun muß noch zwischen solchen WinWord-Anweisungen unterschieden werden, die direkt ausgeführt werden, und solchen, die ein Dialogfeld aufrufen, in dem noch Einstellungen vorgenommen werden müssen, bevor der Befehl ausgeführt wird.
Zunächst möchte ich den einfachen Fall behandeln und Ihnen
WinWord-Anweisungen in Makros vorstellen, die direkt ausgeführt
werden. Handelt es sich hierbei um einen Menübefehl, so gibt es
meistens nur eine Form des Aufrufs. Bei anderen Anweisungen dagegen
gibt es häufig gleich zwei Formen: als Befehl und als Funktion.
Auch wenn ein Menübefehl in WinWord scheinbar nur eine Aufgabe hat,
so kann der zugehörige Makrobefehl durch zusätzliche Angaben von
Parametern unterschiedliche Wirkungen haben. Dies gilt "natürlich"
nicht für alle Befehle. Dies soll an einem Beispiel verdeutlicht
werden. Der Word-Befehl Bearbeiten
Löschen löscht einen markierten Textteil oder das
Zeichen rechts von der Schreibmarke. Wird der Befehl in einem Makro
verwendet, so kann durch Angabe einer Zahl die Anzahl der zu
löschenden Zeichen festgelegt werden. Ist die Zahl dabei kleiner
als Null, werden entsprechend viele Zeichen links von der
Schreibmarke gelöscht. Dies entspricht dann der Rücktaste
(Backspace). Wenn Sie beispielsweise die zwölf Zeichen links der
Schreibmarke und die sieben Zeichen rechts der Schreibmarke löschen
möchten, dann sieht das Makro wie folgt aus:
Sub MAIN
BearbeitenLöschen -12 'löscht 12 Zeichen links vor der Schreibmarke
BearbeitenLöschen 7 'löscht 7 Zeichen rechts nach der Schreibmarke
End Sub
Anmerkung 1:
Die entsprechenden Makroanweisungen zu einem Menübefehl haben immer den gleichen Aufbau: Menünamen und Befehlsname werden ohne Leerzeichen zusammen geschrieben (z.B.DateiÖffnen,FormatZeichen,BearbeitenKopieren). Groß-/Kleinschreibung wird dabei nicht unterschieden.
Anmerkung 2:
Bis auf wenige Ausnahmen muß während der Ausführung des Makros, das WinWord-Anweisungen enthält, ein Dokumentfenster als aktives Fenster gewählt werden, d.h. die Schreibmarke muß sich in einem Dokument befinden.
Wie bereits angedeutet, gibt es auch WinWord-Anweisungen, die in
einem Makro sowohl als Befehl als auch als Funktion eingesetzt
werden können. In letzterem Fall liefert die Funktion einen Wert
zurück (meistens 0 oder -1), der sehr gut in Kontrollanweisungen
(z.B. If … Then …
Else …) abgefragt werden kann. Beispielsweise
wird bei der Anweisung AbsatzUnten die Schreibmarke an
den Anfang des nachfolgenden Absatzes gesetzt. Mit Hilfe der
Funktion AbsatzUnten() kann innerhalb einer
Kontrollanweisung überprüft werden, ob sich die Schreibmarke
überhaupt nach unten bewegen läßt (beispielsweise gelingt dies
nicht, wenn das Ende des Dokuments erreicht wurde). Wenn die
Schreibmarke sich bewegen läßt, liefert die Funktion den Wert -1,
im anderen Fall den Wert 0 (Null). Zusätzlich besitzt diese
Anweisung (bzw. die Funktion) bis zu zwei Parameter; mit dem einen
wird festgelegt, wie viele Absätze übersprungen werden sollen; mit
dem anderen kann angeben werden, ob der oder die Absätze zusätzlich
markiert werden sollen. Bei der Anweisung werden die Parameter
durch Leerzeichen und Klammer getrennt hinter dem Anweisungsnamen
angegeben, bei einem Funktionsaufruf zwischen den beiden runden
Klammern. Ob eine Anweisung oder Funktion einen oder mehrere
Parameter besitzt, können Sie auch aus der Online-Hilfe erfahren.
Geben Sie dazu den Anweisungsnamen ein, setzen die Schreibmarke auf
den Namen und drücken die Funktionstaste <F1>.
Sie erhalten nun eine genaue Beschreibung der Anweisung bzw.
Funktion (inkl. Beispiele). Exemplarisch soll hier die Syntax der
Anweisung AbsatzUnten gezeigt werden:
AbsatzUnten [anzahl][, markierung]
AbsatzUnten([anzahl][, markierung])
anzahl steht dabei für die Anzahl der Absätze, die die Schreibmarke weiterbewegt werden soll. markierung wird spezifiziert, wenn die Absätze markiert werden sollen: Für markierung wird dann der Wert 1 angegeben.
Anmerkung 3:
Bei den eckigen Klammern handelt es sich um Metasymbole. Sie deuten an, daß die Angaben innerhalb der Klammern optional sind. Die eigentlichen Angaben sind grundsätzlich ohne die eckigen Klammern einzugeben.
Anhand zweier Beispiele soll die Funktionsweise von
AbsatzUnten verdeutlicht werden. Im ersten Beispiel
wird die Schreibmarke fünf Absätze nach unten bewegt und der
nächste Absatz komplett markiert. Im zweiten Beispiel wird die
Schreibmarke solange nach unten bewegt, bis das Dokumentende
erreicht ist. Danach wird eine Absatzschaltung (entspricht
Betätigung der Eingabetaste) durchgeführt, um einen neuen Absatz
schreiben zu können (Mir ist bewußt, daß es dafür auch ein
einfacheres Makro gibt! Das Beispiel soll lediglich zur
Beschreibung der Word-BASIC-Funktion AbsatzUnten()
dienen.).
Sub MAIN
AbsatzUnten 5 'Schreibmarke 5 Absätze nach unten
AbsatzUnten 1, 1 'aktuellen Absatz markieren
End Sub
Sub MAIN
While AbsatzUnten() <> 0 'Solange Dateiende nicht erreicht...
AbsatzUnten '...Schreibmarke nach unten bewegen
Wend
EinfügenAbsatz 'Absatzschaltung durchführen
End Sub
WinWord-Anweisungen mit Dialogfeldern
In Word für Windows gibt es sehr viele Befehle, bei denen über ein Dialogfeld meist mehrere Einstellungen vorgenommen werden können. Beispielsweise können Sie beim BefehlFormat Absatz... Einzüge, Zeilenabstände
oder die Ausrichtung gleichzeitig festlegen. Auch innerhalb eines
Makros können diese Befehle verwendet werden. Allerdings erscheinen
die Dialogfelder im Normalfall nicht; sie bleiben "unsichtbar". Sie
können aber auch Makros entwickeln, bei denen zur Laufzeit die
Einstellungen in einem Dialogfelds von Ihnen direkt vorgenommen
werden können, um sie anschließend auf Teile des Dokuments
anzuwenden. Ein Beispiel hierfür finden Sie weiter unten in diesem
Artikel.
Befehle mit Dialogfeldern haben in WinWord-Makros eine eigene
Syntax. Diese möchte ich Ihnen an dem WinWord-Befehl
Format Absatz... näher erläutern. Die
Anweisung hat folgendes (komplettes) Aussehen:
FormatAbsatz [.EinzugLinks = zahl/text]
[, .EinzugRechts = zahl/text]
[, .Vor = zahl/text]
[, .Nach = zahl/text]
[, .ZeilenabstandArt = zahl]
[, .Zeilenabstand = zahl/text]
[, .Ausrichtung = zahl]
[, .AbsatzSteuerung = zahl]
[, .MitNächstemAbsatz = zahl]
[, .ZeilenNichtTrennen = zahl]
[, .Seitenwechsel = zahl]
[, .OhneZeilennumerierung = zahl]
[, .NichtTrennen = zahl]
[, .Registerkarte = zahl]
[, .ErstzeilenEinzug = zahl/text]
Erschrecken Sie nicht durch die vielen Parameter dieser
Anweisung; sie entsprechen lediglich den Einstellungsmöglichkeiten
im Dialogfeld. An den eckigen Klammern können Sie wiederum
erkennen, daß Sie ggf. die betreffenden Parameter auch weglassen
können. Wenn Sie allerdings alle weglassen, macht der Befehl keinen
Sinn. Die Besonderheit dieser Befehle liegt aber darin, daß den
Parameternamen immer ein Punkt vorangestellt ist. Dieser Punkt muß
immer angegeben werden. Wenn für einen Parameter eine Textangabe
erforderlich ist, wird konstanter Text in Anführungszeichen
(") angegeben. Sie können aber auch Variablen
(numerische Variablen oder Textvariablen) angeben, die jedoch einen
Wert besitzen müssen. Im folgenden Beispiel wird für den aktuellen
Absatz ein linker Einzug von 2 cm und als Ausrichtung
Blocksatz eingestellt. Außerdem soll der Absatz von der
automatischen Silbentrennung ausgenommen werden.
Sub MAIN
FormatAbsatz .EinzugLinks = "2 cm", .Ausrichtung = 3, \
.NichtTrennen = 1
End Sub
Anmerkung 4:
Die Reihenfolge bei der Angabe der Parameter ist völlig bedeutungslos.
Anmerkung 5:
Der umgekehrte Schrägstrich (\) am Ende einer Makrozeile bedeutet, daß es sich bei der nachfolgenden Zeile um eine Fortsetzungszeile handelt, die Bestandteil der letzten Anweisung ist.
Neben der Möglichkeit, neue Werte direkt in einem Dialogfeld
einzutragen, können in einem Makro auch die aktuellen Einstellungen
ermittelt werden. Mittels Kontrollanweisungen können diese dann
ausgewertet und je nach Ausgang der Auswertung mit
unterschiedlichen neuen Einstellungen belegt werden. Um die
aktuellen Dialogfeldeinstellungen zu ermitteln, müssen diese in
einer speziellen Variablen, dem Dialogdatensatz, gespeichert
werden. Diese Variable muß mit der Anweisung Dim
initialisiert werden. Die genaue Syntax hierfür lautet:
Dim variable As befehlsname
Dabei ist variable der Name des Dialogdatensatzes,
befehlsname die Bezeichnung für den Menübefehl. Um die
aktuellen Werte dann in die Variable variable zu
übertragen, gibt es den Befehl GetCurValues. Auch hier
die Syntax:
GetCurValues variable
Dabei ist variable wieder der Name des
Dialogdatensatzes. Im nachfolgenden Beispiel wird die Variable
FA als Dialogdatensatz mit den aktuellen Einstellungen
des WinWord-Befehls Format Absatz...
initialisiert.
Sub MAIN
Dim FA As FormatAbsatz
GetCurValues FA
End Sub
Bedenken Sie, daß beim Ablauf dieses Makros keinerlei Änderungen durchgeführt wurden. Es sollte ja auch nur als Einstieg in diese Materie dienen. Erst durch Überprüfung einzelner Informationen mittels Kontrollanweisungen und anschließender Veränderung der Einstellungen macht das Ganze einen Sinn.
Anmerkung 6:
In dem obigen Beispiel wurde bewußt der Variablen der NameFAgegeben. Es sind die Anfangsbuchstaben von "Format" und "Absatz". Solche Namen können dann leichter von anderen Variablen oder Dialogdatensätzen unterschieden werden. Allerdings besteht keine Verpflichtung, diese Vorgehensweise zu übernehmen.
Um nun einzelne Werte des Dialogdatensatzes auswerten zu können,
wird dem Variablenname der entsprechende Parametername des
Menübefehls angehängt. Bedenken Sie bitte dabei, daß der Punkt vor
dem Parameternamen dazugehört; er muß mit angegeben werden. Im
folgenden Beispiel wird überprüft, ob der Einzug des aktuellen
Absatzes (das ist der Absatz, in dem die Schreibmarke sich
befindet) ungleich dem Wert 0 cm ist. Ist dies der
Fall, wird der Wert mittels MsgBox (Beschreibung siehe
im Teil 1, LOGIN 96/4) angezeigt.
Sub MAIN
Dim FA As FormatAbsatz
GetCurValues FA
If FA.EinzugLinks <> "0 cm" Then
MsgBox "Der linke Einzug beträgt: " + FA.EinzugLinks
End If
End Sub
Um nun noch einen Schritt weiterzugehen, wird nach der
Auswertung, ob der Wert des linken Einzugs ungleich
0 cm ist, der rechte Einzug auf denselben Wert und der
Zeilenabstand auf 1,5 ze eingestellt. Dies wird
dadurch erreicht, daß nach der Änderung der Werte der Name des
Dialogdatensatzes als Parameter an den Menübefehl angehängt wird
(im vorliegenden Beispiel die letzte Anweisung innerhalb der
Kontrollanweisung).
Sub MAIN
Dim FA As FormatAbsatz 'Variable initialisieren
GetCurValues FA 'aktuelle Werte speichern
If FA.EinzugLinks <> "0 cm" Then 'linker Einzug vorhanden?
FA.EinzugRechts = FA.EinzugLinks 'auf rechten Einzug übertr.
FA.ZeilenAbstandArt = 1 'Zeilenabstand = 1,5 Zeilen
FormatAbsatz FA 'neue Werte übertragen
End If
End Sub
Bei den obigen Beispielen wird das Dialogfeld zur Laufzeit nicht
angezeigt. Die Einstellungen werden direkt vom Makro durchgeführt,
ohne Einflußmöglichkeit von außen. Sie können sich aber auch das
Dialogfeld zur Laufzeit anzeigen lassen, um die Einstellungen
selbst vorzunehmen. Um ein Dialogfeld anzeigen zu lassen, benötigen
Sie die Makroanweisung Dialog. Hier die Syntax:
Dialog variable [, standardschaltfläche] [,zeitüberschreitung]
Dialog(variable [, standardschaltfläche] [, zeitüberschreitung])
Bei variable handelt es sich um den Namen des
Dialogdatensatzes, wie er bei der Anweisung Dim
festgelegt wurde. Mit standardschaltfläche ist eine Zahl
gemeint, die angibt, welche Schaltfläche als Standardschaltfläche
hervorgehoben sein soll. Dies ist üblicherweise die Schaltfläche
OK. Bei zeitüberschreitung können Sie einen
Wert in Millisekunden angeben, wie lange das Dialogfeld angezeigt
werden soll. Wird kein Wert angegeben, bleibt das Dialogfeld
solange sichtbar, bis eine Schaltfläche gewählt wurde. An der
obigen Syntax können Sie erkennen, daß es diese Anweisung auch als
Funktion gibt. Sie liefert als Wert die Nummer der gewählten
Schaltfläche. Damit können dann - je nach Auswahl - über
Kontrollanweisungen unterschiedliche Anweisungen ausgeführt werden.
Sollen die neuen Einstellungen dann einem Textteil zugeordnet
werden, muß der Menübefehl mit dem Dialogdatensatz als Parameter
nach der Anweisung Dialog angegeben werden.
Bevor ich hierfür ein Beispiel zeige, ist es noch wichtig zu
erwähnen, daß bei der Wahl der Schaltfläche Abbrechen
im Dialogfeld auch das Makro mit einer Fehlermeldung beendet wird.
Dieser ungewollte Abbruch kann auf verschiedene Arten abgefangen
werden. Eine Möglichkeit ist die Anweisung
On Error Goto sprungmarke
Dabei ist sprungmarke der Name einer Zeile innerhalb
des Makros, bei der im Fehlerfall die Ausführung des Makros
fortgesetzt wird. Damit ist es nicht nur möglich, die Fehlermeldung
zu unterbinden, es können auch noch "sinnvolle" Anweisungen
durchgeführt werden, bevor das Makro beendet wird. Die Anweisung
"On Error Goto" wird i.allg. gleich am Beginn des
Makros hinter Sub MAIN eingesetzt.
Ein Beispiel soll nun das Ganze verdeutlichen. Das Makro ruft
das Dialogfeld Datei Seite einrichten...
auf und weist anschließend die neuen Einstellungen dem Dokument
(bzw. dem aktuellen Abschnitt) zu. Falls die Schaltfläche
Abbrechen gewählt wurde, wird das Makro in der Zeile
mit "Fehler:" fortgesetzt: Die Fehlernummer (Wert der
Standardvariablen Err) wird mit Hilfe von
MsgBox angezeigt.
Sub MAIN
On Error Goto Fehler
Dim DSE As DateiSeiteEinrichten
Dialog DSE
DateiSeiteEinrichten DSE
Goto Ende
Fehler:
MsgBox "Die Fehler-Nr. lautet: " + Str$(Err)
Ende:
End Sub
In einem abschließenden Beispiel werden alle Absätze eines
Dokuments, die einen bestimmten linken und rechten Einzug besitzen,
mit einem Rahmen versehen und der Zeilenabstand zum vorherigen bzw.
nachfolgenden Absatz auf 12 pt eingestellt. Die Werte
für den linken und rechten Einzug werden über zwei Dialogfelder
[InputBox$()] erfragt. Damit das Makro seine Arbeit
korrekt verrichten kann, muß neben dem Wert auch die Maßeinheit
eingeben werden (also z.B. 2,34 cm anstelle von
2,34). Damit das Makro nicht unendlich oft durchlaufen
wird, wird über die Funktion AmEndeDesDokuments()
überprüft, ob das Ende des Dokuments erreicht wurde.
Im folgenden Makro wird jede Zeile des Makros mit einer Nummer in eckigen Klammern versehen, um die Zeilen anschließend kommentieren zu können. Die Nummern und natürlich auch die eckigen Klammern sind keine eigentlichen Bestandteile des Makros und dürfen daher auch nicht mit eingegeben werden. Bedenken Sie zusätzlich, daß das Makro nur in einem Dokumentfenster ablauffähig ist.
[1] Sub MAIN
[2] On Error Goto Ende
[3] BeginnDokument
[4] LE$ = InputBox$("Wert für linken Einzug...",, "0 cm")
[5] RE$ = InputBox$("Wert für rechten Einzug...",, "0 cm")
[6] While Not AmEndeDesDokuments()
[7] Dim FA As FormatAbsatz
[8] GetCurValues FA
[9] If FA.EinzugLinks = LE$ And Fa.EinzugRechts = RE$ Then
[10] FormatRahmenSchattierung .LinksRahmenlinie = 3, \
[11] RechtsRahmenlinie = 3, \
[12] ObenRahmenlinie = 3, \
[13] UntenRahmenlinie = 3
[14] FA.Vor = "12 pt"
[15] FA.Nach = "12 pt"
[16] FormatAbsatz FA
[17] End If
[18] AbsatzUnten
[19] Wend
[20] Ende:
[21] End Sub
Erläuterungen:
- [1]
- Beginn des Makros
- [2]
- Bei der Wahl der Schaltfläche
Abbrechenwird zur SprungstelleEndeverzweigt - [3]
- Die Schreibmarke wird an den Anfang des Dokuments gesetzt.
- [4]
- Der Wert für den linken Einzug wird erfragt und in die
Textvariable
LE$abgelegt. - [5]
- Der Wert für den rechten Einzug wird erfragt und in die
Textvariable
RE$abgelegt. - [6]
- Solange das Ende des Dokuments noch nicht (
NOT) erreicht worden ist … - [7]
- … Dialogdatensatz
FAfür aktuellen Absatz initialisieren - [8]
- … Aktuelle Werte für Absatzformatierung ermitteln
- [9]
- … Wenn Wert für linken Einzug dem eingegebenen Wert
LE$und der rechte Einzug dem eingegebenen WertRE$entspricht, dann … - [10]
- … Rahmen für aktuellen Absatz setzen
- [11]
- … Bestandteil von Zeile [9]
- [12]
- … Bestandteil von Zeile [9]
- [13]
- … Bestandteil von Zeile [9]
- [14]
- … Abstand zum vorherigen Absatz auf
12 ptsetzen - [15]
- … Abstand zum nachfolgenden Absatz auf
12 ptsetzen - [16]
- … Neue Werte des Dialogdatensatz
FAdem aktuellen Absatz zuordnen - [17]
- Ende der Abfrage aus Zeile [9]
- [18]
- Schreibmarke um einen Absatz nach unten bewegen
- [19]
- Ende der Schleife aus Zeile [6]
- [20]
- Sprungmarke (im Falle, daß die Schaltfläche
Abbrechengewählt wird) - [21]
- Ende des Makros
