Unsere Webseiten benötigen JavaScript. Dies scheint in Ihrem Browser jedoch deaktiviert zu sein.

News & Tipps zu Microsoft Word

Lesen Sie hier einige der besten Beiträge aus SmartTools Word Weekly sowie ausgewählte Inhalte anderer E-Mail-Newsletter von SmartTools Publishing rund um Microsoft Word.

Beitrag aus SmartTools Word Weekly

Werte aus einer eingebetteten Excel-Tabelle per VBA auslesen

Word 365 2024 2021 2019 2016 2013

FRAGE Unsere Rechnungen bestehen aus einem Word-Dokument mit Briefkopf, Anschriftenfeld usw. Für die Rechnungspositionen und die Berechnung der Gesamtsummen wurde eine eingebettete Excel-Tabelle eingefügt (Einfügen-Tabellen-Tabelle-Excel-Kalkulationstabelle). Wir wollen die Verarbeitung unserer Rechnungen nun weiter automatisieren und müssen dafür Werte aus der eingebetteten Tabelle per VBA auslesen. Das ist uns bislang nicht gelungen. Können Sie Hinweise geben, wie wir per VBA auf die eingebettete Excel-Tabelle zugreifen können?

S. Hölderlin

ANTWORT So trivial, wie es scheinen mag, ist der Zugriff auf eingebettete Excel-Tabellen in der Tat nicht. Wir zeigen Ihnen an einem Beispiel, wie Sie generell vorgehen, und erklären anschließend, worauf Sie achten müssen.

Eine eingebettete Excel-Tabelle ist praktisch, wenn Sie komplexere Berechnungen in ein Word-Dokument integrieren wollen.

Unser Beispiel geht davon aus, dass Sie die Excel-Tabelle in der Textebene eingefügt haben und dass es sich nicht um ein frei verschiebbares Grafikobjekt handelt. Wenn Sie Einfügen-Tabellen-Tabelle-Excel-Kalkulationstabelle aufrufen, positioniert Word die Tabelle standardmäßig in der Textebene (Umbruchoption: "Mit Text in Zeile").

Wir gehen außerdem davon aus, dass Ihr Dokument nur eine einzige eingebettete Excel-Tabelle enthält.

Unter diesen Voraussetzungen können Sie mit folgender VBA-Prozedur zum Beispiel den Inhalt von Zelle F10 der eingebetteten Excel-Tabelle auslesen:

Sub ReadXlEmbeddedSheet()
Dim rng As Range
Dim ils As InlineShape
Dim xlWB As Object
Dim xlWS As Object

Dim varXlValue As Variant

  On Error GoTo ReadXl_Error

  Application.ScreenUpdating = False

  Set rng = Selection.Range

  'InlineShape-Objekt suchen
  For Each ils In ActiveDocument.InlineShapes
    If ils.Type = wdInlineShapeEmbeddedOLEObject Then
      If InStr(ils.OLEFormat.ProgID, "Excel.Sheet") > 0 Then

        'eingebettetes Excel-Objekt aktivieren
        ils.OLEFormat.Activate
        DoEvents
        'Excel-Arbeitsmappe-Objekt
        Set xlWB = ils.OLEFormat.Object
        'Excel-Tabellenblatt-Objekt
        Set xlWS = xlWB.Worksheets(1)

        'Tabellenwert auslesen
        varXlValue = xlWS.Range("F10").Value

        'eingebettetes Objekt wieder verlassen
        SendKeys "{esc}", wait:=True
        DoEvents

        Exit For
      End If
    End If
  Next

  rng.Select

  MsgBox "Gesamtbetrag der Rechnung: " & varXlValue & " Euro"

ReadXl_End:

  Set xlWS = Nothing
  Set xlWB = Nothing
  Set ils = Nothing
  Set rng = Nothing

  Application.ScreenUpdating = True

  Exit Sub

ReadXl_Error:
  MsgBox "Fehler " & Err.Number & ":" & vbCrLf & _
      Err.Description
  Resume ReadXl_End
End Sub

Das erste Problem besteht darin, die eingebettete Excel-Tabelle in Ihrem Dokument zu finden. Bei Objekten in der Textebene handelt es sich um "InlineShapes". Das können aber auch Abbildungen oder sonstige Grafikobjekte sein. Deshalb setzt die Prozedur eine For-Schleife über alle "InlineShapes" ein und prüft als erstes, ob der Typ ein "wdInlineShapeEmbeddedOLEObject" ist. Da es auch andere OLE-Objekte außer Excel-Tabellen geben kann, erfolgt eine weitere Prüfung auf die "ProgID" des Objekts. Eingebettete Excel-Tabellen besitzen entweder die ProgID "Excel.Sheet.8" (altes Excel-Format) oder "Excel.Sheet.12" (neues Format). Nur wenn die ProgID "Excel.Sheet" enthält, werden die VBA-Anweisungen zum Auslesen des Zellinhalts ausgeführt.

Word kann aber nicht direkt auf die Excel-Tabelle zugreifen. Dazu muss das eingebettete OLE-Objekt erst aktiviert werden. Das ist wie bei der manuellen Bearbeitung, wo Sie die Excel-Tabelle auch erst per Doppelklick für Eingaben öffnen müssen.

Nach der Aktivierung können Sie auf den Container der Excel-Tabelle, auf die Arbeitsmappe, zugreifen:

Set xlWB = ils.OLEFormat.Object

Und darüber gelingt dann auch der Zugriff auf das Tabellenblatt:

Set xlWS = xlWB.Worksheets(1)

Nun stehen Ihnen alle VBA-Kommandos für Tabellenblätter zur Verfügung, die Sie auch bei der VBA-Programmierung in Excel einsetzen können. Im Beispiel lesen wir einfach den Wert aus Zelle F10 aus und übergeben ihn an eine Variable:

varXlValue = xlWS.Range("F10").Value

Zum sauberen Beenden Ihrer VBA-Prozedur in Word müssen Sie den Bearbeitungsmodus der eingebetteten Excel-Tabelle aber wieder verlassen. Leider gibt es – analog zur Codezeile "ils.OLEFormat.Activate" – keine Deaktivierungsmethode. Am zuverlässigsten hat sich deshalb eine simple "SendKeys"-Anweisung herausgestellt, die das Drücken der Esc-Taste auslöst. Mit dem Parameter "Wait" und dem anschließenden Aufruf von "DoEvents" lassen Sie Word Zeit, die Aktion erfolgreich abzuschließen.

Die VBA-Prozedur kehrt danach zur ursprünglichen Markierung zurück und zeigt eine "MsgBox" mit dem Wert der ausgelesenen Tabellenzelle an.

Das Ganze ist nicht gerade schnell, und mitunter hakt es beim Verlassen des Bearbeitungsmodus' der eingebetteten Excel-Tabelle. Aber echte Alternativen gibt es leider nicht.