Inhaltsverzeichnis

Verweisprobleme: Late Binding

Allgemein

Um von Excel auf ein Worddokument zuzugreifen, müssen Sie eine zusätzliche Bibliothek in Ihr Projekt einbinden, die Ihnen die entsprechenden Wordobjekte zur Verfügung stellt.

Je nach Office-Version gibt es diese Bibliothek mit unterschiedlicher Versionsnummer. Um die Word-Bibliothek einzubinden, öffnen Sie im VBA-Editor mit Extras - Verweise folgenden Dialog:

Scrollen Sie nach unten und aktivieren Sie das Häkchen bei dem entsprechenden Eintrag und schließen Sie den Dialog mit Klick auf OK.

Da der Verweisdialog in Excel 2010 geöffnet habe, wurde der Verweis auf die Wordbibliothek 14.0 gesetzt. Unter Office 2007 wird der Verweis entsprechend auf die Wordbibliothek 12.0 und unter Office 2013 wird der Verweis auf die Wordbibliothek 15.0 gesetzt. Dieser Verweis wird auf eine höhere Versionsnummer automatisch angepasst, auf eine niedrigere Versionsnummer aber nicht.

Was bedeutet das in der Praxis: Sie entwickeln Ihre Anwendung unter Office 2010. Ein User kann die Anwendung problemlos unter Office 2013 (oder höher) verwenden, allerdings wird der Verweis automatisch auf die höhere Bibliotheksversion angepasst. Öffnet ein anderer User die Anwendung wieder unter Office 2010 (oder niedriger) wird ein Kompilierfehler angezeigt.

Wenn Sie den Verweisdialog im VBA-Editor öffnen, sehen Sie beim Verweis auf die Wordbibliothek, dass die Versionsnummer hinaufgesetzt wurde und die Datei natürlich nicht gefunden wurde.

Entfernen Sie das Häkchen beim fehlenden Verweis und setzen Sie den Verweis auf die vorhandene Wordbibliothek. Ihr Code sollte wieder problemlos funktionieren.

Interessanterweise wird der Verweis auf die eingebundene Bibliothek zum Zugriff auf Datenbanken (Microsoft Office [Versionsnummer] Access database engine Object Library) auf höhere und niedrigere Versionsnummern automatisch angepasst.

Das Problem mit dem Verweis auf die Wordbibliothek ist sehr ärgerlich, vor allem wenn bei einem Auftraggeber unterschiedliche Office Versionen im Einsatz sind. Die Lösung ist der Einsatz von Late Binding, das Ihren Entwicklungsprozess folgendermaßen beeinflusst:

  • Entwickeln der Anwendung mit gesetztem Verweis auf die Wordbibliothek und Deklaration aller Variablen vom entsprechenden Word-Typ (z. B. Word.Application, Word.Document, ...). Dies hat den Vorteil, dass Sie bei Verwendung der Variablen die Auswahllisten mit den Methoden und Eigenschaften des jeweiligen Wordobjekts angezeigt bekommen.
  • Vor der Auslieferung entfernen Sie den Verweis auf die Wordbibliothek (ich mache vorher immer eine Kopie der Anwendung, um eine Version mit gesetztem Verweis zu behalten).
  • Alle Variablendeklarationen umschreiben auf den Datentyp Object. Die Variable kann somit zur Laufzeit auf jede beliebige Instanz eines Objekttyps verweisen, also z. B. auf ein Word.Document- oder Word.Application-Objekt. Daher auch die Bezeichnung Late Binding, da nicht schon bei der Deklaration, sondern erst bei der Verwendung der Objektvariable der entsprechende Typ referenziert wird.
  • Sollten sie die Erzeugung der Wordapplikation mit New Word.Application bewerkstelligt haben, so verwenden Sie stattdessen die Anweisung CreateObject.
  • Ersetzen aller verwendeten Konstanten, die die Wordbibliothek zur Verfügung stellt durch den entsprechenden Zahlenwert oder durch selbstdefinierte Konstanten.
  • Kompilieren des VBA-Projekts (Debuggen - Kompilieren). Haben Sie die obigen Punkte korrekt abgearbeitet, sollte das Kompilieren ohne Fehler ablaufen.

Ändern der Variablendeklaration

Ursprünglich sieht Ihr Code beispielhaft so aus:

'Variablendeklaration mit Early Binding
Dim wdApp As Word.Application
Dim wdDoc As Word.Document

Nach dem Entfernen des Verweises auf die Wordbibliothekt kennt VBA die Word-Datentypen nicht mehr. Deklarieren Sie die entsprechenden Variablen vom Datentyp Object.

'Variablendeklaration mit Late Binding
Dim wdApp As Object
Dim wdDoc As Object

Nach dieser Änderung werden Ihnen bei der Verwendung der Variablen die entsprechenden Methoden und Eigenschaften nicht mehr in Auswahlklappfeldern angezeigt.

Erzeugen der Wordanwendung

Wenn Sie eine Instanz von Word mit der Anweisung New Word.Application erzeugt haben, sieht Ihr Code beispielhaft so aus:

'Wordinstanz mit New Word.Application
Dim wdApp As Object
Set wdApp = New Word.Application

Nach Entfernen des Verweises auf die Wordbibliothek ist die Klasse Word.Application nicht mehr verfügbar. Die Methode CreateObject nimmt die Klassenbezeichnung als Zeichenkette entgegen und liefert als Funktionswert die entsprechende Objektinstanz.

'Wordinstanz mit CreateObject
Dim wdApp As Object
Set wdApp = CreateObject("Word.Application")

Verwendung von Word-Konstanten

Im folgenden Codebeispiel sind die oben beschriebenen Änderungen schon durchgeführt. Die Variablen sind vom Datentyp Object und die neue Wordinstanz wird mit CreateObject erzeugt. Nach dem Hinzufügen eines neuen leeren Dokuments wird die Variable wdRange auf den Bereich des ersten Absatzes gesetzt und die horizontale Ausrichtung des Absatzes auf Zentriert geändert.

'Verwendung von Word-Konstanten
Dim wdApp As Object
Dim wdDoc As Object
Dim wdRange As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
Set wdDoc = wdApp.Documents.Add
Set wdRange = wdDoc.Paragraphs(1).Range
wdRange.ParagraphFormat.Alignment = wdAlignParagraphCenter

Nach Entfernen des Verweises auf die Wordbibliothek sind auch die Word-Konstanten (beginnend mit wd) nicht mehr verfügbar. Es gibt zwei Wege, dieses Problem in den Griff zu bekommen.

Verwenden der Zahl

Jede Word-Konstante entspricht einer Zahl. Um die Zahl zu ermitteln, die sich hinter der Konstante wdAlignParagraphCenter verbirgt, öffnen Sie Word auf normalem Wege und wechseln in den Word-VBA-Editor. Wechseln Sie in den Objektkatalog (Ansicht - Objektkatalog) und geben Sie als Suchbegriff wdAlignParagraphCenter ein.

Im unteren Bereich des Objektkatlogs sehen Sie, dass die Konstante wdAlignParagraphCenter der Zahl 1 entspricht.

Ersetzen Sie im Code die Konstante wdAlignParagraphCenter durch die Zahl 1.

'Verwendung von Zahlen
Dim wdApp As Object
Dim wdDoc As Object
Dim wdRange As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
Set wdDoc = wdApp.Documents.Add
Set wdRange = wdDoc.Paragraphs(1).Range
wdRange.ParagraphFormat.Alignment = 1

Da durch dieses Vorgehen die Verständlichkeit des Codes leidet (wer weiß schon auswendig, was die Zahl 1 in diesem Kontext bedeutet), empfiehlt sich die Verwendung eigener Konstanten.

Verwendung eigener Konstanten

Sie wissen jetzt, dass sich hinter der Word-Konstante wdAlignParagraphCenter die Zahl 1 verbirgt. Die eleganteste Lösung ist die weitere Verwendung der "sprechenden" Konstantenbezeichnungen: der Code bleibt verständlich und Sie sparen sich die Änderungen im Code.

Am besten deklarieren Sie die Konstanten in einem eigenen Modul (ich gebe diesem Modul meist die Bezeichnung modOfficeKonstanten).

Im folgenden Beispiel sehen Sie beispielhaft die Deklaration einiger Word-Konstanten.

'Nachbau der Word-Konstanten
Public Const wdAlignParagraphLeft = 0
Public Const wdAlignParagraphCenter = 1
Public Const wdAlignParagraphRight = 2
Public Const wdPageNumberStyleArabic = 0

Somit verwendet Ihr Code wieder die "sprechende" Konstantenbezeichnung.

'Verwendung nachgebauter Word-Konstanten
Dim wdApp As Object
Dim wdDoc As Object
Dim wdRange As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
Set wdDoc = wdApp.Documents.Add
Set wdRange = wdDoc.Paragraphs(1).Range
wdRange.ParagraphFormat.Alignment = wdAlignParagraphCenter

Fazit

Der Umbau auf Late Binding verursacht einiges an Arbeit. Mit jedem weiteren Projekt wird dies allerdings leichter, da auch diese Aufgabe so wie vieles irgendwann Teil der Routine wird. Der Lohn ist die Ersparnis jeglichen Kopfwehs, das bei der Verwendung unterschiedlicher Office-Versionen auftreten könnte.

Seitenanfang   Inhaltsverzeichnis