Word-Dokumente per VBA einlesen

Früher oder später möchten Sie vielleicht einmal Inhalte aus Word-Dokumenten in Access-Tabellen einlesen. Dabei gilt es einiges zu beachten: Zum Beispiel, dass sich die Inhalte nicht etwa über ein seiten- oder spaltenorientiertes Objektmodell einlesen lassen, sondern dass der Inhalt prinzipiell eine einzige Abfolge von Absätzen ist. Wie Sie diese einlesen und dabei auch die unterschiedlichen Absatz- und Zeichenformatvorlagen berücksichtigen, zeigt dieser Beitrag.

In diesem Beitrag gehen wir davon aus, dass Ihnen ein Word-Dokument mit einigen Absatzformatvorlagen und Zeichenformatvorlagen vorliegt. Dieses könnte beispielsweise wie in Bild 1 aussehen.

Beispiel-Dokument dieses Beitrags

Bild 1: Beispiel-Dokument dieses Beitrags

Wir möchten in diesem Beitrag die Techniken vorstellen, die dazu notwendig sind, die einzelnen Texte samt der Formatierung in eine Access-Tabelle einzulesen. Dazu werden wir den Text zunächst Absatz für Absatz durchlaufen und die Inhalte speichern, später schauen wir uns noch an, wie Sie die in den einzelnen Absätzen enthaltenen Zeichenformatvorlagen identifizieren können. Diese werden wir in Form entsprechender Auszeichnungen wie unter HTML in den in der Tabelle gespeicherten Texten unterbringen.

Formatvorlagen erstellen

Wenn Sie zuvor noch nicht mit Formatvorlagen gearbeitet haben, benötigen Sie noch einige grundlegende Informationen darüber. Es gibt einige verschiedene Typen von Formatvorlagen, von denen wir die folgenden berücksichtigen werden:

  • Absatzformatvorlagen: Damit werden die Formateigenschaften eines kompletten Absatzes festgelegt, also etwa Einzüge, Abstände zum vorherigen und zum nachfolgenden Absatz
  • Zeichenformatvorlagen: Damit legen Sie das Aussehen der Zeichen fest, also etwa Schriftart, Schriftgröße, Fett, Kursiv et cetera.
  • Verknüpfte Formatvorlagen: Dies sind kombinierte Formatvorlagen, die sowohl Formateigenschaften für den Absatz als auch für den enthaltenen Text festlegen. Mit einer solchen Vorlage können Sie also sowohl komplette Absätze versehen als auch einzelne, vor der Zuweisung markierte Textpassagen.

Neue Vorlage anlegen

Wenn die von Ihnen gewünschten Vorlagen noch nicht vorhanden sind, legen Sie diese zunächst an. Dazu öffnen Sie etwa unter Word 2010 zunächst den Dialog Formatvorlagen, indem Sie auf den kleinen Pfeil unten rechts in der Ribbongruppe Start|Formatvorlagen klicken. Der Dialog sieht wie in Bild 2 aus.

Formatvorlagen-Dialog

Bild 2: Formatvorlagen-Dialog

Klicken Sie hier auf die Schaltfläche Neue Formatvorlage, erscheint ein weiterer Dialog namens Neue Formatvorlage (s. Bild 3). Hier legen Sie zunächst den Namen für die neue Formatvorlage fest, zum Beispiel H1 für die erste überschriftenebene. Als Formatvorlagentyp verwenden wir zunächst Absatz. Da dies die oberste überschriftenebene sein soll, legen Sie für die Eigenschaft Formatvorlage basiert auf den Eintrag (Keine Formatvorlage) fest. Fehlt noch die Formatvorlage für den folgenden Absatz. Damit stellen Sie ein, welche Formatvorlage automatisch für Absätze verwendet werden soll, die nach Einfügen eines Zeilenumbruchs etwa durch Betätigen der Eingabetaste von einem Absatz mit der Formatvorlage H1 aus zugewiesen werden soll. Dieses Absatzformat haben wir bislang noch nicht festgelegt, also lassen wir die Eigenschaft auf H1 stehen.

Der Dialog Neue Formatvorlage

Bild 3: Der Dialog Neue Formatvorlage

Nun können Sie mit den Elementen im Bereich Formatierung die grundlegenden Formatierungen festlegen:

  • Schriftart
  • Schriftgröße
  • Fett, Kursiv, Unterstrichen
  • Schriftfarbe
  • Horizontale Ausrichtung
  • Vertikale Ausrichtung
  • Abstand zur vorherigen Zeile vergrößern und verkleinern
  • Einzug vergrößern und verkleinern

Danach folgen noch einige weitere Optionen:

  • Zur Liste der Schnellformatvorlagen hinzufügen: Fügt die neu erstellte Formatvorlage zur Liste der Schnellformatvorlagen im Ribbon zu (s. Bild 4).
  • Automatisch aktualisieren: Diese Option bewirkt, dass die Formatvorlage, auf die sich ein Text bezieht, bei änderung der Formatierung des Textes im Dokument ebenfalls ändert. Wenn Sie also die neu erstellte Absatzformatvorlage auf einen Absatz anwenden und dann im Dokument die Schriftart dieses Absatzes anpassen, wird auch die Schriftart in der entsprechende Formatvorlage angepasst.
  • Nur in diesem Dokument/Neue auf dieser Vorlage basierende Dokumente: Wenn Sie gerade eine Dokumentvorlage erstellen, können Sie festlegen, ob die definierten Formatvorlagen in Dokumente übernommen werden, die neu auf Basis dieser Dokumentvorlage erstellt werden.

Schnellformatvorlagen

Bild 4: Schnellformatvorlagen

Weiter unten geht es dann ans Eingemachte: Mit einem Klick auf die Schaltfläche Format klappen Sie ein Menü auf, mit dem Sie weitere Dialoge zum Einstellen folgender Parameter öffnen können:

  • Schriftart
  • Absatz
  • Tabstopp
  • Rahmen
  • Sprache
  • Positionsrahmen
  • Nummerierung
  • Tastenkombination

Wir wollen an dieser Stelle nicht ins Detail gehen – wichtig ist, dass Sie die wichtigen Schritte zum Erstellen der Formatvorlagen kennen.

Wenn Sie neben den Absatzformatvorlagen für eine oder mehrere überschriften auch eine für den Fließtext erstellt haben (im Beispieldokument heißt dieses p), können Sie diese bei den überschrift-Formatvorlagen für die Eigenschaft Formatvorlage für den folgenden Absatz einstellen.

Auf diese Weise erstellen wir einige Formatvorlagen und legen ein einfaches Dokument an, das wir im Folgenden einlesen und in einer Tabelle speichern.

Verweis auf die Word-Bibliothek

Damit Sie gleich einfach auf das Objektmodell von Word zugreifen können, fügen Sie dem VBA-Projekt der aktuellen Datenbank noch einen Verweis auf die Word-Bibliothek hinzu. Dazu wählen Sie im VBA-Editor den Menüpunkt Extras|Verweise aus. Dort aktivieren Sie den Eintrag Microsoft Word x.0 Object Library (s. Bild 5).

Einfügen eines Verweises auf die Word-Bibliothek

Bild 5: Einfügen eines Verweises auf die Word-Bibliothek

Word-Dokument öffnen

Nun wollen wir das Word-Dokument öffnen, die Inhalte der einzelnen Absätze einlesen und zunächst im Direktbereich des VBA-Editors ausgeben und schließlich das Dokument und Word wieder schließen.

Dazu verwenden wir die Prozeduren und Funktionen aus Listing 1. Zunächst deklarieren wir dort eine Objektvariable zum Aufnehmen eines Verweises auf eine Instanz von Word namens objWord. Um die gewünschten Aufgaben durchzuführen, programmieren wir eine Hauptprozedur namens WordDokumentEinlesen. Diese deklariert eine Variable namens strDokument, die den Namen des einzulesenden Dokuments aufnimmt. Diese Variable füllt die Prozedur mit dem Verzeichnis der aktuellen Datenbank plus dem Namen des Beispieldokuments Beispiel.docx. Beim Aufruf der Funktion DokumentOeffnen übergibt die Prozedur den Dokumentnamen und erhält einen Verweis auf das geöffnete Dokument zurück. Dokument-Oeffnen füllt sowohl die Objektvariable objWord mit einem Verweis auf eine neu erstellte Word-Instanz als auch die Rückgabevariable objDokument mit einem Verweis auf das soeben geöffnete Dokument.

Dim objWord As Word.Application
Public Function DokumentOeffnen(strDokument As String) As Word.Document
     Dim objDokument As Word.Document
     Set objWord = New Word.Application
     Set objDokument = objWord.Documents.Open(strDokument)
     Set DokumentOeffnen = objDokument
End Function
Public Function DokumentSchliessen(objDokument As Word.Document)
     objDokument.Close False
     objWord.Quit
     Set objWord = Nothing
End Function
Public Sub WordDokumentEinlesen()
     Dim objDokument As Word.Document
     Dim strDokument As String
     Dim objAbsatz As Word.Paragraph
     strDokument = CurrentProject.Path & "\Beispiel.docx"
     Set objDokument = DokumentOeffnen(strDokument)
     objWord.Visible = True
     For Each objAbsatz In objDokument.Paragraphs
         Debug.Print objAbsatz.Range.Text
     Next objAbsatz
     DokumentSchliessen objDokument
End Sub

Listing 1: Prozeduren zum öffnen, Einlesen und Schließen eines Word-Dokuments

Die Prozedur WordDokumentEinlesen stellt dann die Eigenschaft Visible von objWord auf True ein und macht das Word-Fenster so sichtbar. Nun kommt die Hauptarbeit: In einer For Each-Schleife über alle Elemente der Paragraphs-Auflistung des Word-Dokuments durchläuft die Prozedur alle Absätze des Dokuments. Dabei gibt sie jeweils den Inhalt der Text-Eigenschaft des zum aktuellen Absatz gehörenden Range-Objekts im Direktfenster aus. Das Ergebnis sieht schließlich wie in Bild 6 aus. Anschließend ruft die Prozedur noch die Funktion DokumentSchliessen auf, die zunächst das aktuelle Dokument mit der Close-Methode schließt.

Ausgabe des Inhalts der einzelnen Absätze im Direktbereich

Bild 6: Ausgabe des Inhalts der einzelnen Absätze im Direktbereich

Der Wert False für den ersten Parameter dieser Methode sorgt dafür, dass keine änderungen gespeichert werden. Anschließend beendet sie die Word-Instanz mit der Quit-Methode und leert die Objektvariable objWord.

Von hier aus könnten Sie nun auch einfach die Inhalte der Absätze in jeweils einen Datensatz einer Tabelle schreiben. Wir benötigen aber noch weitere Informationen – zum Beispiel die Bezeichnung der Absatzformatvorlage, die dem jeweiligen Absatz zugeordnet wurde. Also erweitern wir die Ausgabe innerhalb der Schleife wie folgt:

Debug.Print objAbsatz.Range. ParagraphStyle, objAbsatz.Range.Text

Die ParagraphStyle-Eigenschaft gibt nun den Namen der jeweils verwendeten Formatvorlage aus, sodass die Ausgabe im Direktbereich nun wie in Bild 7 aussieht.

Ausgabe der Absätze plus Name der Absatzformatvorlage

Bild 7: Ausgabe der Absätze plus Name der Absatzformatvorlage

Für den Fall, dass das Word-Dokument aufgrund eines Fehlers einmal geöffnet bleibt oder Sie das Dokument zum Bearbeiten geöffnet haben, erweitern wir außerdem die Funktion Dokument-Oeffnen noch um einen Parameter für die Open-Methode:

Set objDokument = objWord.Documents. Open(strDokument, , True)

Der hier verwendete Parameter heißt ReadOnly und sorgt dafür, dass die Meldung aus Bild 8 ausbleibt.

Meldung, wenn eine bereits geöffnete Datei geöffnet werden soll

Bild 8: Meldung, wenn eine bereits geöffnete Datei geöffnet werden soll

Damit können wir nun die Texte der einzelnen Absätze und ihre Formatierungen in einer Tabelle speichern. Aber was geschieht, wenn innerhalb eines Absatzes nur ein oder mehrere Wörter mit einer Zeichenformatvorlage versehen sind

Zeichenformatvorlagen erkennen

Dies ist etwas komplizierter als das Durchlaufen der Absätze – zumindest, wenn man es auf einem etwas umständlicheren Weg probiert. Vor einiger Zeit habe ich einmal alle Zeichen eines Absatzes durchlaufen, bis ich auf ein Zeichen gestoßen bin, das mit einer entsprechenden Zeichenformatvorlage versehen war.

Dies habe ich dann als Startpunkt der Formatierung registriert und habe den Text dann Zeichen für Zeichen weiter untersucht, bis ich zum nächsten Zeichen ohne diese Zeichenformatvorlage gelangte. Um diese formatierten Zeichen habe ich dann eine entsprechende Markierung gesetzt, beispielsweise und . Das hat bei längeren Texten natürlich eine Weile gedauert.

Wenn man sich jedoch etwas mit Word und mit den Möglichkeiten zum Suchen und Ersetzen beschäftigt, stößt man schnell auf eine wesentlich effizientere und schnellere Technik.

Diese sieht beispielsweise wie in Listing 2 aus.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar