VB Startseite

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.

Zugriffsebene:

Datei / gesamtes Dokument

Absatz

Textmarken

Textfelder

Tabellen

Zeichen

Range

Datei / gesamtes Dokument

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.

nach oben, zur Auswahl

Absatz

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.

nach oben, zur Auswahl

Textmarken

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.

nach oben, zur Auswahl

Textfelder

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.

nach oben, zur Auswahl

Tabellen

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.

nach oben, zur Auswahl

Zeichen

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.

nach oben, zur Auswahl

Range

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.

VB Startseite nach oben, zur Auswahl