[HRZ der JLU Gießen]
[HRZ-Collage]
[JLU-Logo mit Wappen; anklickbar; alt+j]
   Home > HRZ > Service > Veröffentlichungen > LOGIN 97/1  
Service [an error occurred while processing this directive]
Organisation
Datennetz
Nachrichtentechnik
Zentraler Medienservice
E-Learning/KOMM
Computer & Peripherie
Software

LOGIN-Gesamtverz. • LOGIN 97/1, Inhalt • 

Erstellen von Makros in Word für Windows (Teil 2)

(E-Mail: Gerd-Michael.Sens@hrz.uni-giessen.de 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. IfThenElse …) 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 Befehl Format 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 Name FA gegeben. 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 Abbrechen wird zur Sprungstelle Ende verzweigt
[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 FA fü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 Wert RE$ 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 pt setzen
[15]
… Abstand zum nachfolgenden Absatz auf 12 pt setzen
[16]
… Neue Werte des Dialogdatensatz FA dem 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 Abbrechen gewählt wird)
[21]
Ende des Makros
Suche
Telefon
uni-intern; eingeschränkter ZugangNamen, Adressen,
E-Mail (X.500)

HRZ von A--Z
Site-Map
Aktuelles
HRZ-Dienste, Status
Welche Datei ist neu?
Web-Mail
neue Web-Seiten der JLU
Kontakt
Druckversion

Justus-Liebig-Universität Gießen, Ludwigstraße 23, 35390 Gießen
Telefon: +49 641 99 0; Fax: +49 641 99 12259, Pressestelle, Impressum
Infos, Korrekturen und Anregungen bitte an: webmaster@hrz.uni-giessen.de
Konzeption + Realisierung: HRZ

[<]    [.]    [^]    [>]

Letzte Änderung am 17.11.2005 von GP


[.] [..]