JurPC Web-Dok. 173/2002 - DOI 10.7328/jurpcb/2002178176

Ralph Matzky *

Mehr Komfort unter Word mit VBA

JurPC Web-Dok. 173/2002, Abs. 1 - 11


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.JurPC Web-Dok.
173/2002, Abs. 1

1. Fußnotengestaltung

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).Abs. 2
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".Abs. 3
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.Abs. 4

2. Dokumentenverwaltung

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.Abs. 5
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

SPEICHERN übernehmen und das Dokument sichern. Das Makro lässt sich einfach verwenden, wenn man es über ANSICHT, SYMBOLLEISTEN, ANPASSEN ... einer bestimmten Tastenkombination oder es als eine neue Schaltfläche einer Symbolleiste zuweist. Zukünftig wird beim erstmaligen Speichern eines Dokuments dieses Makro zur Namensvergabe aufgerufen, jedes weitere Speichern erfolgt wie gewöhnlich(16).
Abs. 6
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.Abs. 7
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).Abs. 8

3. Automatisches Lesezeichen

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).Abs. 9
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.Abs. 10

4. Zusammenfassung

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.
JurPC Web-Dok.
173/2002, Abs. 11

Fußnoten:

(1) Gerade Dissertationen u.ä. zeichnen sich durch eine unüberschaubare Anzahl von Fußnoten aus, die leicht den vierstelligen Bereich erreichen können.
(2) Dies bedeutet einen erheblichen Aufwand. Geht man z.B. von 1500 Fußnoten aus und einer gleichbleibenden Bearbeitungsgeschwindigkeit von 5 Sekunden pro Fußnote aus, so bedeutet das einen (rechnerischen) Zeitaufwand von 125 min. Die tatsächlich benötigte Zeit dürfte 125 min weit überschreiten.
(3) Zur Art und Weise des Erstellens von Makrocode vgl. bereits Matzky, Schluss mit der Routinearbeit in Word - Tabellen und VBA, JurPC Web-Dok. 171/2002. Sämtlicher Makrocode kann wiederum bei der Adresse http://www.uni-greifswald.de/~ls2/wimi/vba.html heruntergeladen werden.
(4) Die Markierung würde man beim herkömmlichen Bearbeiten eines Textes entweder durch den Einsatz der Maus oder durch das Bewegen des Cursors nach rechts bei gleichzeitigem Festhalten der Umschalttaste ("Shift-Taste") erzielen. Dabei ist zu beachten, dass die zwei Zeichen für zweistellige Fußnoten ausreichen. Bei drei- oder mehrstelligen Zeichen muss der Wert entsprechend erhöht werden. Dabei ist zu beachten, dass die Schleife immer nur solange durchlaufen wird, wie Fußnoten der jeweiligen Stellenanzahl existieren, z.B. 100 bis 999 = 900, und der Cursor vor Makrostart in die jeweils erste Fußnote (z.B. 100) gesetzt wird.
(5) Zur Funktionsweise vgl. Matzky, JurPC Web-Dok. 171/2002.
(6) In Matzky, JurPC Web-Dok. 171/2002 wurde bereits darauf hingewiesen, dass durch die Eingabe des Punktes hinter einem Objekt oder einer Kategorie sich ein Dialogfenster öffnet, das die möglichen Kategorien/Eigenschaften auflistet.
(7) Sowohl im Fußnotentext wie auch im laufenden Text.
(8) Diese stellt man unter FORMAT, ABSATZ... ein.
(9) Wörter in KAPITÄLCHEN-GESTALTUNG weisen auf die entsprechenden Menüeinträge hin.
(10) Die Dokumenteneigenschaften findet man unter DATEI, EIGENSCHAFTEN. Sie sind nicht nur in Word abrufbar, sondern in jeder Dateiauflistung über das Kontext-Menü der rechten Maustaste unter dem Menüpunkt EIGENSCHAFTEN.
(11) Dies wird meist dann der Fall sein, wenn es sich um mehrere Anweisungen handelt, die bei positiver Bedingung ausgeführt werden sollen.
(12) Es ist also unproblematisch möglich, ineinander verschachtelte Bedingungen zu kreieren.
(13) CStr() erschließt sich über die Bedeutung "change in string".
(14) Die Extraktion der einzelnen Zahlen und deren Zusammenführung ist deshalb erforderlich, da im deutschsprachigen Raum die Datumsschreibweise im Format TT.MM.JJJJ erfolgt. Sinnvoller für die Sortierung ist aber die Form JJJJ-MM-TT. Man kann zwar in der Systemsteuerung diese länderspezifische Einstellung ändern. Dies hat dann aber Auswirkung auf alle Programme und ist daher nicht zu empfehlen.
(15) Zur Verwendung der Befehle "with" und "end with" vgl. Matzky, JurPC Web-Dok. 171/2002.
(16) Es ist natürlich auch möglich, mittels dieses Makros das Dokument erneut unter einem anderen Dateinamen zu speichern.
(17) Die Nummer des Dateityps lässt sich dadurch ermitteln, dass man mit DATEI, SPEICHERN UNTER ... den entsprechenden Dialog aufruft und in der Liste den gewünschten Eintrag "auszählt". Dabei ist mit Null zu beginnen.
(18) Der Dialog selbst wird nicht angezeigt. Dazu bedürfte es des Befehls "show", der zweckmäßigerweise in eine Zeile vor die "execute"-Anweisung gesetzt wird.
(19) Vgl. die Herangehensweise in Matzky, JurPC Web-Dok. 171/2002.
(20) Dies kann zum Beispiel der Fall sein, dass die Datei schreibgeschützt ist oder sich auf einem nichtbeschreibbaren Datenträger (z.B. CD-ROM) befindet. Ohne diese "Fehlerbehandlung" würde beim Fehlschlagen des Speichern eine Meldung des Visual Basic-Editors erscheinen, welche die Möglichkeit zur Fehlerbeseitigung enthält. Dieser bedarf es jedoch nicht, da nur im Ausnahmefall der Speicherversuch misslingt.
* Dr. iur. Ralph Matzky ist wissenschaftlicher Assistent am Lehrstuhl für Strafrecht, insb. Wirtschafts- und Steuerstrafrecht von Prof. Dr. Wolfgang Joecks in Greifswald.
[online seit: 05.08.2002]
Zitiervorschlag: Autor, Titel, JurPC Web-Dok., Abs.
Zitiervorschlag: Matzky, Ralph, Komfort in Word mit VBA - JurPC-Web-Dok. 0173/2002