Home › JurPC Web-Dok. 173/2002 Komfort in Word mit VBA
In dem Beitrag JurPC Web-Dok. 171/2002 wurden einige erste praktische Einsatzmöglichkeiten der Makrosprache von Word gezeigt, um Routineaufgaben beim Umgang mit Tabellen zu vermeiden und durch den PC erledigen zu lassen. Dieser Beitrag führt die Thematik der Makros fort und geht zuerst auf die Formatierung von Fußnoten ein. Im weiteren wird gezeigt, wie der Umgang mit Dokumenten programmgesteuert werden kann. Dabei geht es weniger um komplexe Abläufe. Im Vordergrund stehen vielmehr die grundlegenden Befehlsstrukturen. Durch deren kombinierten Einsatz soll der Anwender in die Lage versetzt werden, die Arbeit mit Word seinen eigenen Bedürfnissen anzupassen. Dokumente aus dem wissenschaftlichen, insbesondere aus dem juristischen Bereich zeichnen sich durch den Einsatz von Fußnoten aus. Sie stellen einen wesentlichen Teil von Aufsätzen, Hausarbeiten oder Dissertationen dar. Ihre Gestaltung bedarf daher auch einer verstärkten Beachtung. Die Formatierung wird zum Problem, wenn es gilt, mit den von Word vorgegebenen Möglichkeiten eine Vielzahl von Fußnoten zu erfassen(1). Word bietet dem Benutzer zwar den Einsatz von Formatvorlagen, z.B. "Fußnotenzeichen" an, so dass sich Veränderungen an der Vorlage auf alle ihr zugewiesenen Objekte auswirken. Aber genau die eben genannte Formatvorlage ist bei der unterschiedlichen Gestaltung der Fußnotenzeichen im fortlaufenden Text und in dem Fußnotentext unzureichend. Änderungen an dieser Formatvorlage wirken sich stets sowohl auf die Fußnoten im Text wie auch im Fußnotentext aus. Es ist beispielsweise nicht möglich, mit einem Befehl die Fußnotenzeichen im laufenden Text "hochgestellt" zu formatieren, diejenigen im Fußnotentext jedoch unberührt zu lassen. Eine Änderung der Formatvorlage "Fußnotentext" führt auch nicht zum gewünschten Ergebnis. Der einzige Ausweg besteht darin, nachträglich die Formatierung "hochgestellt" einzeln von sämtlichen Fußnotenzeichen entweder im laufenden Text oder des Fußnotentextes zu deaktivieren(2). Stellt sich im Nachhinein heraus, dass eine weitere Formatierung erforderlich wäre, so ist der gesamte Aufwand ein weiteres Mal erforderlich. Abhilfe schafft hier nur ein Makro, dass sämtliche Fußnotentexte durchläuft und die gewünschten Formatierungen vornimmt(3). Als Objekt der Programmausführung dient in diesem Fall nicht das Fußnotenzeichen, sondern die jeweilige Cursorposition, die mit "selection" umschrieben wird. Voraussetzung ist natürlich, dass sich der Cursor im Fußnotentext befindet. Die Anweisung "selection.-homekey" sorgt für dasselbe Ergebnis wie das Drücken der "Pos1"-Taste. Die Ergänzung "unit:=wdline" stellt sicher, dass der Sprung an den Zeilenanfang (und nicht z.B. an den Dokumentenanfang) ausgeführt wird. Der Befehl "selection.moveright" entspricht dem Drücken der Richtungstaste "Nach rechts". Mit "unit:=wdcharakter" geht der Cursor zeichenweise, und zwar um zwei Zeichen ("count:=2"), nach rechts. "Extend:=wdextend" stellt sicher, dass diese zwei Zeichen markiert werden(4). In der fünften Zeile wird die Schrift-Formatierung "hochgestellt" ("Superscript") mit dem Wert "false" deaktiviert. Die Tastaturbewegung nach rechts in der nächsten Zeile hebt die ursprüngliche Markierung auf. Anschließend muss nur noch dafür gesorgt werden, dass das Makro zur nächsten Fußnote "springt". "Selection.GoTo What:=wdGoToFootnote, Which:=wdGoToNext, Count:=1, name:=""" bedeutet eine Gehe-Zu-Anweisung der Gestalt, dass genau die nächste Fußnote das Zielobjekt ist ("wdgotonext" und "count:=1"). Diese Routine muss entsprechend der genauen Anzahl von Fußnoten durchlaufen werden. Dafür steht die "for...next"-Schleife in den Zeilen 2 und 7(5). Das eben vorgestellte Makro beruht also darauf, dass die Fußnotenzeichen in dem Fußnotentext formatiert werden. Es ist jedoch genauso möglich, die einzelnen Fußnotenzeichen im laufenden Text zu gestalten. Hierzu eignet sich das Objekt "footnote(index).reference". Die Variable "index" steht für die jeweilige Fußnote. Das Objekt "footnote" besitzt die Kategorie "font", die ihrerseits verschiedene Eigenschaften, u.a. "superscript" ("hochgestellt") hat(6). Letztere wird durch die Wahl von "true" oder "false" ein- bzw. ausgeschaltet. Wenn also sämtliche Fußnoten(7) über die Formatvorlage "Fußnotenzeichen" "nicht hochgestellt" formatiert wurden, so eignet sich folgendes Listing, um nachträglich sämtliche Fußnotenzeichen im laufenden Text wieder "hochzustellen". Der Endwert der "for... next"-Schleife (hier im Beispiel bei 234) muss natürlich der Gesamtanzahl der Fußnoten angepasst werden. Der Vorteil des ersten Makros besteht darin, dass man neben der bereits dargestellten Formatierung u.U. weitere Gestaltungen des Fußnotentextes zugleich erledigen kann. Soll beispielsweise bei mehrzeiligen Fußnoten der Text jeweils untereinander angeordnet werden, so verwendet man die Absatzformatierung(8) "Extra-Hängend". Voraussetzung ist dafür aber, dass sich zwischen dem Fußnotenzeichen und dem folgenden Zeichen ein Tabulator befindet. Fügt man diesen nicht gleich beim Erstellen der Fußnote ein, bedarf es einer entsprechenden Nacharbeit. Diese lässt sich vereinfachen, fügt man in das erste Makro nach der Zeile 6 die Anweisung "selection.typetext Text:=vbTab" ein. Mit ihr wird vor dem ersten Textzeichen ein Tabulator ("vbTab") eingefügt. Der Befehl "typetext" ist generell geeignet, Text hinzuzufügen. VBA kann auch den Umgang mit Dokumenten vereinfachen. Eine vom Verfasser langjährig praktizierte Übung besteht darin, einem Dokument nicht nur einen Namen zu geben, sondern diesem das Datum der Speicherung voranzustellen, z.B. "2002-02-27 - Dokumentenname". Bei der Auflistung der Dateien im ÖFFNEN-Dialog(9) bzw. im Windows-Explorer werden die Dokumente sofort dem Entstehungsdatum nach aufgelistet, unabhängig davon, wann ein Dokument zuletzt bearbeitet und gespeichert wurde. Weiterhin lassen sich somit Vorgänge unter demselben Namen anlegen, wenn dies an verschiedenen Tagen geschieht. Dies bietet beim evt. späteren Suchen nach Dokumenten eine Erleichterung. Nun ist es sicherlich unproblematisch, beim Speichern vor dem Namen das Datum einzugeben. Mit einigen wenigen Makrozeilen kann dies jedoch von Word übernommen werden. Hinzu kommen soll noch, dass der Dateiname gleichzeitig in die Zeile "Titel" der Dokumenteneigenschaften eingetragen wird(10). Das folgende Makro sieht auf den ersten Blick kompliziert aus, bei genauerem Hinsehen erschließt es sich fast von selbst. In der zweiten Zeile wird mit "if ... then"- eine Bedingung in das Makro eingebaut. Diese lautet "activedocument.saved = false" und sorgt dafür, dass ein Dateiname nur dann vergeben wird, wenn das Dokument nach der letzten Bearbeitung nicht gespeichert wurde. Wurde also bereits gespeichert, dann trifft die Bedingung nicht zu und der nach "then" folgende Programmcode (Zeilen 3 bis 15) wird nicht ausgeführt. Auf eine Besonderheit sei dabei hingewiesen. Befindet sich der nach "then" folgende Code nicht in derselben Programmzeile(11), so muss diese Bedingung mit dem Befehl "end if" abgeschlossen werden. Wenn also im vorliegenden Fall das Dokument nicht gespeichert ist, geht das Makro zur dritten Zeile. Dort befindet sich wieder eine Bedingung(12). Diese steht im Zusammenhang mit der Ermittlung des aktuellen Monats. Bei einer einstelligen Monatszahl soll nämlich eine Null vorangestellt werden. "Month(now)" ergibt den aktuellen Monat. Ist dieser kleiner 10, also einstellig, dann wird die Variable "monat" mit einer Null und der Monatszahl belegt. Im anderen Fall - dafür steht das "else" - wird direkt die Monatszahl genommen. Der Befehl "cstr()" sorgt dafür, dass Zahlenwerte als Textelemente behandelt und verarbeitet werden(13). In der vierten Zeile findet dasselbe Verfahren für die Tageszahl statt. Für die Jahreszahl bedarf es dieser Selektion nicht, da diese vierstellig vorliegt und so auch verwendet werden kann. Es schließt sich in Zeile 5 nunmehr die Zusammenführung der einzelnen Textelemente zum vollständigen Datum an(14). Das Pluszeichen verbindet die Variableninhalte sowie den Text, der sich zwischen zwei Anführungszeichen befindet. Das Ergebnis befindet sich dann in der Variablen "datum". Die Zeilen 6 bis 10 sorgen dafür, dass Word das Dialogfenster für die Dokumenteneigenschaften öffnet ("execute" - Zeile 8), nachdem in die Zeile "Titel" desselben Dialogfensters der Inhalt der Variablen "datum" eingetragen wurde. Mit ".show" wird der Dialog aufgerufen, so dass der Benutzer weitere Angaben tätigen kann(15). Das Makro bietet mit der Zeile 11 den Komfort, dass der gesamte Inhalt der Zeile "Titel" (also das aktuelle Datum und evt. zusätzliche Benutzereingaben) in der Variablen "dateiname" erfasst wird. Die folgenden Zeilen ähneln den vorhergehenden sehr stark. Es wird mit "dialogs(wddialogfilesaveas)" der "SPEICHERN UNTER..."-Dialog aufgerufen und anschließend der Inhalt der Variablen "dateiname" als zukünftiger Dateiname vorgeschlagen. Damit entspricht der Dateiname dem aktuellen Inhalt der Titelzeile der Dokumenteneigenschaften, die ihrerseits das Datum verkörpert. Der Benutzer kann den Dateinamen ändern oder ihn wie gewöhnlich mit einem Mausklick auf Ein weiteres Anwendungsgebiet von VBA könnte darin liegen, Dokumente nicht im Dateiformat der verwendeten Word-Version zu speichern, sondern in einem anderen Dateiformat. Gewöhnlich würde man dazu den Befehl SPEICHERN UNTER... aufrufen, um danach in der Zeile DATEITYP den gewünschten einzustellen. Wie bereits aus dem vorhergehenden Makro bekannt, ruft der Befehl "dialogs(wddialogfilesaveas)" den SPEICHER UNTER...-Dialog auf. Mit der Anweisung ".format = 16" wird der Dateityp auf "Word 6.0/95" eingestellt(17). Um das vorherige Speicherformat nicht zu überschreiben, wird dem alten Dateinamen die Zeichengruppe "W6" (die Anführungszeichen erscheinen im Dokumentennamen nicht) vorangestellt. ".Execute" führt das Speichern dann aus(18). Sobald man mehrmals an einem längeren Dokument arbeiten muss, wäre es ein angenehmes Verhalten von Word, beim Öffnen des Dokuments an die zuletzt bearbeitete Stelle zu springen. Von Hause ist dem Verfasser eine solche Funktion in Word nicht bekannt. Mit zwei kleinen Makros lässt sich dies unproblematisch bewerkstelligen. Dabei sei darauf hingewiesen, dass die folgenden Makros nicht wie üblich in einem Modul erstellt werden. Die Makros befinden sich im Visual Basic-Editor(19) vielmehr unter dem Eintrag "Normal", "Microsoft Word Objekte". Ein Doppelklick auf "ThisDocument" eröffnet daneben eine Eingabemöglichkeit. Das erste Makro definiert bei dem Schließen eines Dokuments eine Textmarke mit dem Namen "Quickmark" an der Stelle, wo sich momentan (also im Augenblick des Schließens) der Cursor befindet. "Activedocument.bookmarks.add" fügt die Textmarke hinzu. Mit "range:=selection.range" wird die letzte Cursorposition abgefragt und mit "name:=" die genaue Bezeichnung festgelegt. Wichtig ist, dass das Makro "document_close()" heißt, da ansonsten es auf das Schließen-Ereignis nicht reagiert. In der vierten Zeile wird dann das Dokument nochmals gespeichert und anschließend geschlossen. Die Anweisung "on error goto ende" dient dem kontrollierten Beenden des Makros für den Fall, dass die Speicher-Anweisung (Zeile 4) nicht ausgeführt werden kann(20). Das Makro "document_open()" aktiviert sich bei jedem Öffnen eines Dokuments, das auf der Grundlage der Dokumentenvorlage "Normal" erstellt wurde. Der Befehl "on error goto ende" sichert nur den Fall ab, dass die Textmarke - aus welchen Gründen auch immer - nicht im Dokument vorhanden ist. Dann wird nämlich die Zeile 3 nicht bearbeitet und das Makro ohne Fehlermeldung beendet. Die Anweisung "selection.goto" wurde bereits bei der Fußnotenbearbeitung verwendet. Sie beinhaltet die Gehe-Zu-Routine. Mit "what:=wd-gotobookmark" wird festgelegt, dass zu einer Textmarke zu springen ist, welche die unter "name:=" angegebene Bezeichnung trägt. Visual Basic for Application ist eine leistungsfähige Makrosprache, die sich für die vielfältigsten Aufgaben und Routinen eignet. Sie beschränkt sich nicht nur auf den Einsatz in Word, sondern ist im gesamten Office-Bereich verfügbar. Dieser Beitrag konnte anhand der Beispiele nur einen kleinen Einblick die Möglichkeiten der Automatisierung geben. Dem interessierten Leser und Word-Benutzer eröffnet sich somit die Gelegenheit, die vorgestellten Makros an die eigenen Bedürfnisse anzupassen und gleichzeitig nach Erweiterungen und Verbesserungen zu suchen. * Dr. iur. Ralph Matzky ist wissenschaftlicher Assistent am Lehrstuhl für Strafrecht, insb. Wirtschafts- und Steuerstrafrecht von Prof. Dr. Wolfgang Joecks in Greifswald. |