VBA für Word '97 |
Man kann davon ausgehen, dass der VBA Befehlssatz abwärtskompatibel ist, d.h. die beschriebenen Lösungen funktionieren auch im Word 2000. Es besteht lediglich die Möglichkeit, dass manches inzwischen auch anders/ besser gelöst werden kann.
In allen Beispielen findet die Variable WordAppl als Ausgangsobject Verwendung:
Dim WordAppl As Object
Set WordAppl = CreateObject("Word.Application") | Setzen des Objektes ist Grundlage aller folgenden Anweisungen |
FileNumber = Shell("C:\MS Office\Office\WinWord.EXE", 3) | Die Shell-Funktion ermöglicht den Neustart von Word mit Einstellung von Fenstergröße und Focus. |
Anzahl = WordAppl.Documents.Count | Die Anzahl der bereits geöffneten Dokumente wird ermittelt. Mit Hilfe des Fehlercodes lässt sich auch auf noch nicht geöffnetes Word schließen. |
WordAppl.Documents.Open "C:\Ablage\Protokoll.doc" | So wird eine (weitere) Datei geöffnet und steht als aktives Dokument zur Verfügung. |
WordAppl.ActiveDocument.SaveAs "Hallo.doc" | Natürlich lässt sich das Dokument auch beliebig speichern. |
WordAppl.ActiveDocument.PrintOut | Das entspricht einem Klick auf das Druckersymbol. |
WordAppl.ActiveDocument.Close 0 | Close schließt das Dokument und der Parameter 0 verhindert eine eventuelle Abfrage "Soll das Dokument gespeichert werden...". |
WordAppl.Application.Quit | Damit wird Word wieder beendet. |
Fehlerbeschreibung = Err.Description | Das Error-Objekt wird bei jedem Fehler automatisch erzeugt. Es hat außerdem eine Fehlernummer (.Number) und kann mit .Clear gelöscht werden. |
WordAppl.Visible = True AppActivate WordAppl |
Ohne Visible erscheint das Object nicht auf dem Bildschirm und ohne Activate kann man nicht darauf zugreifen. Die beiden Befehlszeilen sind in dieser Reihenfolge zwingend erforderlich. |
WordAppl.WindowState = 1 | Damit wird die Fenstergröße festgelegt (0 - normal; 1 - groß; 2 - minimiert). Natürlich kann man für die Ziffern auch erst Konstanten definieren. |
WordAppl.Screenupdating = False | Die Bildschirmaktualisierung benötigt viel Zeit und führt während der Bearbeitung nur zum Flackern der Anzeige. Es ist deshalb sinnvoll, sie zu Beginn der Prozedur abzuschalten und am Ende mit TRUE wieder einzuschalten. |
WordAppl.ActiveDocument.Sections.Add | Ein Seitenumbruch wird eingefügt und so auf ein neues Blatt gewechselt (neuer Abschnitt). |
WordAppl.ActiveDocument.Sections.Last.PageSetup.LeftMargin = 90 | Für diesen Abschnitt (geht nur für ganze Seite) wird der linke Seitenrand auf 90 Punkte gesetzt. |
WordAppl.ActiveDocument.Content.InsertParagraphAfter | Am Ende des Dokuments wird ein weiterer Absatz eingefügt (Zeilenschaltung mit ENTER). |
WordAppl.ActiveDocument.Sections.Last.Range.InsertAfter "Und das war's" | Dieser Text wird am Ende des Dokuments angefügt. |
WordAppl.ActiveDocument.Paragraphs.Last.Format.LeftIndent = 200 | Der letzte Absatz erhält einen abweichenden linken Einzug von 200 Punkten. |
WordAppl.Selection.Paragraphs(1).Alignment = 2 | So wird die Textausrichtung im ersten Absatz des markierten Bereichs auf rechts gesetzt. |
In den meisten Fällen ist es einfacher, das Layout eines Dokumentes direkt in Word zu erzeugen und nur die veränderlichen Daten per Programmroutine aktuell einzutragen. Eine Möglichkeit, bestimmte Positionen im Dokument immer wieder aufzufinden, sind Textmarken (auch Sprungmarken, eben Bookmarks).
AnzahlBookmark = WordAppl.ActiveDocument.Bookmarks.Count | Die Anzahl der Textmarken wird bestimmt, um sie z.B. in einem Textarray abbilden zu können. |
For Count = 1 To AnzahlBookmark TextBM(Count) = WordAppl.ActiveDocument.Bookmarks(Count).Name Next |
In dieser Schleife werden die Namen aller Textmarken in das Array TextBM() geschrieben. |
WordAppl.ActiveDocument.Bookmarks("Anrede") = "Frau" | So kann man eine Textmarke durch beliebigen neuen Text ersetzen. |
WordAppl.ActiveDocument.Bookmarks(Count).Select | Setzt man den Cursor an eine bestimmte Stelle, kann man damit festlegen, welcher Dokumentausschnitt bei der Anzeige zuerst erscheint. |
Set AktiverBereich = WordAppl.ActiveDocument.Bookmarks("Absatzmarke5").Range | Ein Ausschnitt (hier "Absatzmarke5") lässt sich auch einem weiteren Object (AktiverBereich) zuweisen, das vereinfacht die Befehlszeilen oft erheblich. |
Eine der vielen Möglichkeiten, ein Dokument zu füllen, ist die Verwendung von Textfeldern. Sie bietet sich besonders dann an, wenn in ein vorbereitetes Schriftstück nur einige variable Werte per Programm eingetragen werden sollen. So hat man eine Layout-Übersicht auch ohne aktuelle Daten.
AnzahlFF = WordAppl.ActiveDocument.FormFields.Count | Die Anzahl der Textfelder wird bestimmt, um sie z.B. in einem Textarray abbilden zu können. |
For Count = 1 To AnzahlFF TextFF(Count) = WordAppl.ActiveDocument.FormFields(Count).Name Next |
In dieser Schleife werden die Namen aller Textfelder in das Array TextFF() geschrieben. |
For Each TextFormularFeld In ActiveDocument.FormFields TextFF = TextFormularFeld.Name MsgBox TextFF Next TextFormularFeld |
VBA bietet inzwischen mehrere Möglichkeiten - diese Schleife erledigt dieselbe Aufgabe wie die vorhergehende. |
WordAppl.ActiveDocument.FormFields("Anrede").Result = "Frau" | Stehen die Namen der Textfelder fest, kann man direkt darauf zugreifen um einen Inhalt (Text) zu übergeben. |
Ich nutze für kompliziertere Formatierungen meist Tabellen - man muss ja den Rahmen nicht mit anzeigen. Die Alternative mit mehrspaltigem Text in einem Abschnitt birgt zu viele Überraschungen (Textverschiebungen durch ungewollte Zeilenumbrüche, Bilder werden immer falsch platziert, kurz - Word weigert sich hartnäckig, das gewünschte Aussehen anzunehmen oder gar zu behalten).
WordAppl.ActiveDocument.Tables.Add Range:=aktBereich, NumRows:=5, NumColumns:=3 | Im aktiven Bereich (der lässt sich z.B. mit Hilfe einer Textmarke festlegen) wird eine Tabelle mit 5 Zeilen und 3 Spalten angelegt. |
WordAppl.ActiveDocument.Tables(1).Columns(2).Width = MillimetersToPoints(30) | Die Spaltenbreite wird festgelegt. Ich arbeite am liebsten direkt mit Points, aber man kann sich das auch gleich umrechnen lassen. |
WordAppl.ActiveDocument.Tables(1).Rows(3).Height = 20 | Die Höhe der 3. Spalte wird auf 20 Punkte gesetzt. |
WordAppl.ActiveDocument.Tables(1).Rows(3).Cells.VerticalAlignment = 1 | Die standardmäßige Textposition in der Zelle oben kann man mit 1 auf Middle und 3 auf Bottom ändern. |
WordAppl.ActiveDocument.Tables(1).Columns(2).TabStops.Add Position:=70, Alignment:=wdAlignTabDecimal | Dann kommen wir mal zur hohen Schule: In der Spalte 2 wird ein dezimaler Tabulator plaziert - um Zahlen exakt am Komma auszurichten. |
WordAppl.ActiveDocument.Tables(1).Cells(1,1).InsertCells wdInsertCellsEntireColumn | Links neben der angegebenen Zelle wird eine ganze Spalte eingefügt.
WdInsertCellsEntireColumn ist Standard, da kann der Parameter auch entfallen. Es gibt weiter wdInsertCellsEntireRow, wdInsertCellsShiftDown und wdInsertCellsShiftRight. |
WordAppl.ActiveDocument.Tables(1).Cell(1, 1).Range.InsertAfter "Sabrina" | Unter dieser Zelle wird eine weitere Tabellenzeile eingefügt. Die erste Zelle erhält den Eintrag "Sabrina". |
WordAppl.ActiveDocument.Tables(1).Cell(1, 1).Merge .Cell(1, 3) | Der Zellbereich 1. Zeile, Spalten 1 bis 3 werden zu einer Zelle verbunden. |
WordAppl.ActiveDocument.Tables(1).Cell(1, 1).Range.Italic = True kursiv | Viele Einstellungen sind nur für Range-Objekte vorgesehen. An sich ist das kein Problem, denn wie hier bei der Einstellung von Kursivschrift kann der Bereich mühelos bis auf eine einzelne Zelle herunter gebrochen werden. |
AnzahlWoerter = WordAppl.ActiveDocument.Words.Count | Für einen Aufsatz kann so locker die Wortanzahl ermittelt werden. |
WordAppl.ActiveDocument.Words(25).Select | Das 25. Wort wird markiert um den Eingabecursor für weitere Operationen genau an dieser Stelle zu haben. |
AnzahlZeichen = WordAppl.ActiveDocument.Characters.Count | So werden die einzelnen Zeichen gezählt. Statt dem gesamten Dokument kann man auch nur in einem Absatz oder innerhalb einer Markierung zählen. |
WordAppl.ActiveDocument.Characters(37).Bold = True | Im Dokument wird das 37. Zeichen fett dargestellt. |
WordAppl.Selection.Font.Name = "Helvetica" WordAppl.Selection.Font.Size = 16 WordAppl.Selection.Font.ColorIndex = wdRed WordAppl.Selection.Font.Shadow = True |
Hier wird die Markierung bearbeitet. Es gibt z.B. alle möglichen Einstellungen für die Schrift - dargestellt sind nur einige wenige Optionen. |
Das Objekt Range (Bereich) ist ein sehr umfassendes Programmierhilfsmittel, das in den
Beispielen schon mehrfach auftauchte. Es kann von der einzelnen Cursorposition bis zum
gesamten Dokument jeden beliebigen Bereich beschreiben.
Die Handhabung ist fast identisch mit einer Selection (Markierung), nur dass ein Range im
Text nicht sichtbar wird. Hier noch ein paar Beispiele:
Dim aktRange As Object
Set aktRange = WordAppl.ActiveDocument.Section(1) | Der 1. Abschnitt (ohne besondere Formatierungen ist das eine Seite) wird dem Range Objekt zugewiesen. |
aktRange.Collapse | Der Range wird auf eine Cursorposition reduziert. Ohne weitere Parameter ist das genau vor dem 1. Zeichen des bisherigen Bereichs. |
aktRange.InsertFile "C:\autoexec.bat" | So wird der Inhalt einer Datei eingefügt. Dies entspricht dem Einfügen des Inhalts aus der Zwischenablage. |
WordAppl.ActiveDocument.InlineShapes.AddPicture "C:\face.bmp", False, True, aktRange | Beim Einfügen einer Grafik wird der Range als Parameter verwendet. |
Vorsicht beim korrekten Zusammenfügen der Programmzeilen! Diese Seite skaliert sich auf Deine Bildschirmbreite und kann so zu Zeilenumbrüchen führen, die eine zusammenhängende Programmzeile auseinanderreißen. Bei Unstimmigkeiten genügt es, im Browser die Schrift soweit zu verkleinern, bis es keine ungewollten Zeilenschaltungen mehr gibt.