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.

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.