Objektbibliotheken

Tippt man irgendwo im VBA-Editor As, öffnet IntelliSense eine Liste, deren Einträge teils nichts mit VBA, sondern mit der Applikation zu tun haben und sich je nach Applikation unterschieden. Was zur Verfügung steht, hängt davon ab, welche Objektbibliotheken Objektbibliotheken eingebunden sind. Welche das sind, sieht man im Verweisfenster, das im Menü unter Extras/Verweise aufgerufen wird.

Verweise
Verfügbare Verweise:
Visual Basic For Applications
Microsoft Access **.0 Object Libary
OLE Automation
Microsoft Office **.0 Object Libary
Microsoft Office **.0 Access database engine Object Libary  
Microsoft Excel **.0 Object Libary
Microsoft PowerPoint **.0 Object Libary  
Microsoft Word **.0 Object Libary  
Microsoft ActiveX Data Objects *.1 Libary

Priorität




Microsoft Access **.0 Object Libary
  Pfad:   C:\Program Files (x86)\Microsoft Office\Office......

Je nach eingebundenen Objektbibliotheken ändert sich der Funktionsumfang von VBA. Jede Bibliothek stellt dabei beispielsweise Klassenmodule und Aufzählungen zur Verfügung, wie wir sie inzwischen auch selbst erstellen könnten. Und tatsächlich könnte man auch eigene Officedateien hier einbinden und den darin enthaltenen Code entsprechend in anderen Officedateien nutzen.

VBA selbst steckt in der Bibliothek Visual Basic For Applications, weswegen diese Bibliothek immer eingebunden sein muss, genau wie die Objektbibliothek der Hostanwendung. Für Microsoft Word wäre das z. B. die Microsoft Word Object Libary. Für manche Applikationen können weitere Bibliotheken sinnvoll oder sogar nötig werden. So sieht man im obigen Beispiel einen Verweis auf die Microsoft Office Access database engine Object Libary, die in Microsoft Access den Zugriff auf Abfragen via VBA ermöglicht. Außerdem gibt es Bibliotheken, die den Funktionsumfang von VBA erweitern, wie etwa um einen Dateidialog.

Je nachdem, welche Programme auf dem PC installiert sind, kann die Verweisliste sehr viel länger werden. Viele Programme ganz verschiedener Hersteller unterstützen sogenannte „Automation“ oder auch „OLE-Automation“, mit der ein anderes Programm auf dessen sogenannte ActiveX-Objekte zugreifen kann. Mit anderen Worten: Man kann damit ein solches Programm aus einem anderen heraus steuern. Sollte allerdings unser VBA-Code einmal auf einem anderen PC laufen und die entsprechende Anwendung ist dort nicht installiert, verursacht das natürlich einen Fehler.

Um eine Objektbibliothek zu nutzen, muss man sie einfach im Verweisfenster zusätzlich zu den bestehenden Einträgen auswählen. Damit sind deren Funktionen von vornherein mit eingebunden (sogenanntes Early Binding). Die folgende Prozedur EarlyBinding greift aus einer beliebigen Anwendung auf Microsoft Word zu. Fehlt allerdings der Verweis auf die Word-Bibliothek, nutzt auch die Fehlerprozedur nichts. Alternativ kann man auch ohne Einbindung der Objektbibliothek programmieren (sogenanntes Late Binding). Dann steht kein IntelliSense zur Verfügung, was das Programmieren etwas schwieriger macht. Die Prozedur LateBinding ist mit EarlyBinding identisch, könnte aber einen eventuellen Fehler bei der Verwendung von wd auffangen.

Public Sub EarlyBinding()
On Error GoTo FEHLER
Dim wd As Word.Application

Set wd = New Word.Application  'ohne Verweis erfolgt Kompilierfehler
Debug.Print wd.Version
Exit Sub

FEHLER:
Debug.Print Err.Number         'wird bei Kompilierfehler nicht aufgerufen
End Sub

Public Sub
LateBinding() On Error GoTo FEHLER Dim wd As Object Set wd = CreateObject("Word.Application") Debug.Print wd.Version Exit Sub FEHLER: Debug.Print Err.Number End Sub

Um die Vorteile von Early- und Late Binding zu vereinen, wird in der Praxis vielfach mit Early Binding entwickelt, das fertige Produkt dann aber als Late Binding genutzt. Um problemlos dazwischen umschalten zu können, bietet sich die bedingte Kompilierung an. Die Kompilerkonstante wird dann üblicherweise in den Projekteigenschaften gesetzt.

Public Sub Binding()
On Error GoTo FEHLER

#If EarlyBinding = True Then
    Dim wd As Word.Application  'Verweis notwendig!
    Set wd = New Word.Application
#Else
    Dim wd As Object
    Set wd = CreateObject("Word.Application")
#End If

Debug.Print wd.Version
Exit Sub

FEHLER:
Debug.Print Err.Number
End Sub