Prüfen, ob Word gestartet ist

15.12.2006 von Helma  Spona
Nutzen Sie Word zum Exportieren von Daten, Ausgeben von Serienbriefen oder anderen Aufgaben, ist es oftmals erforderlich, Word aus Access heraus zu starten. Das ist im Prinzip recht einfach. Schwierig wird es erst, wenn Sie eine bestimmte Version von Word benötigen.

Mit der GetObject-Funktion können Sie ein geladenes Objekt zurückgeben oder auch ein Objekt aus einer Datei laden. Das ist abhängig da- von, ob Sie als ersten Parameter einen Dateinamen oder als zweiten einen Klassennamen übergeben.

Das können Sie sich zunutze machen, wenn Sie prüfen möchten, ob eine Anwendung, hier Word, gestartet ist. Sie versuchen in diesem Fall einfach ein Word.Application-Objekt zurückzugeben. Gelingt dies, hat die entsprechende Objektvariable anschließend einen Wert ungleich nothing. Sie müssen also nur noch prüfen, ob die Variable gleich nothing ist, dann ist Word nicht gestartet.

Wichtig ist allerdings, dass beim Aufruf von GetObject ein Laufzeitfehler auftritt, wenn Word nicht gestartet ist. Sie müssen daher unbedingt Laufzeitfehler behandeln oder, wie in Listing 1, übergehen. Folgende Funktion gibt true zurück, wenn Word gestartet ist, beziehungsweise false, wenn es nicht gestartet ist.

Function boolWordgestartet() As Boolean
Dim objWord As Object
On Error Resume Next
Set objWord = GetObject(, "Word.Application")
If objWord Is Nothing Then
'Word ist nicht gestartet
boolWordgestartet = False
Else
boolWordgestartet = True
End If
End Function

Prüfen, ob eine bestimmte Word-Version gestartet ist

Etwas komplizierter ist es schon, wenn Sie prüfen möchten, ob eine bestimmte Word-Version gestartet ist. Theoretisch gibt es dazu zwei Möglichkeiten.

Die erste Möglichkeit zeigt Listing 2. Hier wird zunächst mit der GetObject-Funktion das Word.Application-Objekt zurückgegeben. Falls das gelingt, befindet sich dieses nun in der Variablen objWord und Sie können dessen Version- Eigenschaft abfragen. Dies ist aber eine Zeichenkette, die in der Regel einen Punkt enthält, beispielsweise "11.0" für Word 2003. Nach dem Punkt könnte aber auch eine weitere Zahl kommen, die abhängig vom installierten Service-Pack eine Unterversion angibt. Damit Sie die Zahl vor dem Punkt ermitteln und zurückgeben können, wird zunächst mit der Val-Funktion die Zeichenkette in eine Zahl konvertiert und diese dann mit CByte in einen Bytewert konvertiert.

Function WordVersiongestartet1() As Byte
Dim objWord As Object
On Error Resume Next
Set objWord = GetObject(, "Word.Application")
If objWord Is Nothing Then
'Word ist nicht gestartet
WordVersiongestartet1 = 0
Else
WordVersiongestartet1 = CByte(Val(objWord.Version))
End If
End Function

Die Funktion gibt die ermittelte Word-Version zurück oder 0, wenn Word nicht gestartet ist.

Der Nachteil besteht darin, dass die GetObject- Funktion irgendein vorhandenes Word.Application- Objekt zurückgibt. Hat der Benutzer beispielsweise gleichzeitig Word 97 und Word 2003 offen, ist es dem Zufall überlassen, welches Objekt die GetObject-Funktion ermittelt, und damit auch, welche Version die Funktion liefert. Gibt die Funktion also zum Beispiel 8 zurück, heißt das noch nicht, dass die Word-Version 9 (2000) nicht auch gestartet ist.

Versuchen, ein bestimmtes Word-Objekt zurückzugeben

Besser wäre daher rein theoretisch, Sie verwenden die zweite Methode. Allerdings hat auch sie einen Haken. Sie funktioniert nämlich nicht. Zwar können Sie an den Klassennamen Word.Application auch eine Version anhängen, zum Beispiel Word.Application.8 für Word 97. Leider liefert VBA dennoch immer irgendein Objekt zurück, in der Regel das Word-Objekt mit der höchsten Versionsnummer. Hängen Sie also, wie in Listing 3 zu sehen, die als Parameter übermittelte Version an den Klassennamen an, gibt die Funktion über Übergabe des Wertes 8 auch dann true zurück, wenn Word 2003 gestartet ist.

Function WordVersiongestartet2(bytVersion As Byte) As Boolean
Dim objWord As Object
On Error Resume Next
Set objWord = GetObject(, "Word.Application." & bytVersion)
If objWord Is Nothing Then
'Word ist nicht gestartet
WordVersiongestartet2 = False
Else
WordVersiongestartet2 = True
End If
End Function

Da Sie also leider mit Hilfe der GetObject- Funktion nicht auf eine bestimmte Instanz von Word zurückgreifen können, spielt es aber auch keine Rolle, dass ältere Word-Versionen nicht gefunden werden. Sie können diese Instanzen ohnehin nicht zurückgeben und sie daher auch nicht per Code steuern. Möchten Sie also zum Beipiel Word 97 starten, wenn auf dem System schon Word 2003 gestartet ist, können Sie das nur, indem Sie Word 97 mit der CreateObject- Funktion neu starten. Dazu können Sie die Funktion in Listing 4 verwenden, die die erzeugte Word-Instanz zurückgibt. Das funktioniert natürlich nur, wenn die entsprechende Version auf dem Rechner installiert ist.

Function WordStarten(bytVersion) As Object
On Error Resume Next
Set WordStarten = CreateObject("Word.Application." & bytVersion)
End Function

Zusammenfassung

Mit Hilfe der Funktion WordVersiongestartet1 können Sie eine Instanz von Word ermitteln und deren Version zurückgeben. Entspricht diese Version nicht der gewünschten, können Sie sie mit Hilfe der Funktion WordStarten starten und zurückgeben. Mehr Komfort ist leider nicht möglich, sodass es dennoch vorkommen kann, dass Sie eine Version von Word starten, die in Wirklichkeit schon gestartet ist.