Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Nachdem wir in zwei weiteren Artikeln beschrieben haben, wie man auf Word-Dokumente zugreift und die Ereignisse von Word und den angezeigten Dokumenten nutzt, gehen wir nun einen Schritt weiter: Wir schauen uns an, wie wir die Inhalte von Word-Dokumenten lesen und schreiben können. Das ist nicht ganz trivial, denn natürlich enthält ein Word-Dokument nicht einfach nur Text, den wir in eine Variable übertragen und weiterverarbeiten können. Stattdessen gibt es eine Unterteilung in Absätze, Bereiche, Tabellen und viele weitere Elemente. Der Fokus dieses Artikels liegt daher auf der Untersuchung dieser Elemente und wie wir diese am besten per VBA programmieren können.
Vorbereitung für die Programmierung von Dokumentinhalten
Da wir bisher per VBA weder Texte in ein Word-Dokument geschrieben noch gelesen haben, starten wir systematisch – wir schreiben diese zuerst in ein Dokument und lesen die Inhalte dann ebenfalls per VBA aus.
Die nachfolgenden Prozeduren wollen wir nicht von einer anderen Anwendung aus ausführen, sondern diese einfach in das VBA-Projekt des geöffneten Word-Dokuments eintragen und dort aufrufen. Wir greifen dabei mit dem Verweis ThisDocument auf das aktuelle Word-Dokument zu.
Dokument explizit referenzieren
Wenn Du die nachfolgenden Beispiele auf ein anderes Dokument anwenden möchtest als das mit ThisDocument referenzierte Dokument, weil Du beispielsweise von einer anderen Anwendung aus arbeiten möchtest, verwendest Du eine wie folgt deklarierte Variable dazu:
Dim objDocument As Word.Document
Dieses referenzierst Du bei einem neu zu erstellenden Dokument beispielsweise wie folgt:
Dim objWord As Word.Application Set objWord = New Word.Application Set objDocument = objWord.Documents.Add
Weitere Möglichkeiten zum Referenzieren eines Word-Dokuments zeigen wir im Artikel Word mit VBA programmieren (www.vbentwickler.de/348).
Text in ein Dokument einfügen
Die einfachste Möglichkeit, einen Text in das neue Word-Dokument einzufügen, ist die folgende Anweisung:
ThisDocument.Range.Text = "Dies ist ein erster Text."
Wir greifen also über ThisDocument auf das Document-Objekt zu, referenzieren dann das Range-Objekt des Dokuments und legen seinen Text fest.
Diese und die folgenden Anweisungen kannst Du in den meisten Fällen innerhalb einer Prozedur ausführen, aber auch als einzelne Anweisung in den Direktbereich des VBA-Editors eingeben und ausführen. Wir können übrigens auch die abgekürzte Form der obigen Anweisung nutzen, denn Text ist die Standardeigenschaft des Range-Objekts und kann somit weggelassen werden:
ThisDocument.Range = "Dies ist ein erster Text."
Was ist das Range-Objekt?
Ein Range-Objekt markiert verschiedene Bereiche eines Dokuments. Dabei liefert die Eigenschaft vieler verschiedener Objekte aus dem Word-Objektmodell jeweils ein eigenes Range-Objekt.
Das Range-Objekt des Document-Objekts beispielsweise markiert den kompletten Inhalt des Dokuments. Wenn wir der Text-Eigenschaft dieses Range-Objekts einen Text zuweisen, wird der komplette Bereich mit dem angegebenen Text überschrieben.
Wenn wir also nach der obigen Anweisung noch die folgende Anweisung absetzen, wird der vorhandene Inhalt gelöscht und durch den neuen Text ersetzt:
ThisDocument.Range.Text = "Noch ein Text."
Welchen Bereich umfasst das Range-Objekt?
Um zu erkennen, welchen Bereich die Range-Eigenschaft jeweils zurückgibt, können wir den Bereich per VBA markieren:
ThisDocument.Range.Select
Die Markierung wird erst sichtbar, wenn Word den Fokus erhält. Das erledigen wir in einer zweiten Anweisung:
Public Sub RangeMarkieren() ThisDocument.Range.Select AppActivate ThisDocument.Name End Sub
Wenn wir diese Prozedur ausführen, nachdem wir die vorherige Anweisung genutzt haben, erhalten wir die Ansicht aus Bild 1. Wir wir sehen, wird tatsächlich der komplette Inhalt markiert, das Range-Objekt des Document-Elements umfasst also den entsprechenden Bereich.
Bild 1: Schreiben eines einfachen Textes
Komplettes Dokument mit Range erfassen
Das komplette Dokument können wir mit der Eigenschaft Content des Document-Objekts erfassen. Durch anschließendes Aufrufen von Select sehen wir den Range des in Content enthaltenen Bereich:
Public Sub KomplettesDokument() Dim objRange As Range Set objRange = ActiveDocument.Content objRange.Select End Sub
Hier sehen wir, dass wir nicht etwa mit Content.Range auf den Range des Content Elements zugreifen. Bei einigen Elementen gibt es keine Range-Eigenschaft – diese liefern direkt ein Range-Objekt zurück.
Ob ein Element selbst den Typ Range aufweist, finden wir mit der TypeName-Funktion für das entsprechende Element heraus:
TypeName(ActiveDocument.Content) Range
Range-Elemente anderer Objekte