Wollten Sie nicht schon immer mal die komplette Kontrolle über Word, Excel und Co. haben Naja, so ganz wird das wohl nie was werden, aber wir tun, was wir können. Zumindest erfahren Sie in diesem Beitrag, wie Sie Office-Anwendungen starten und in Ihrer Access-Anwendung auf verschiedene Ereignisse wie das Öffnen eines Dokuments oder das Beenden der Office-Anwendung reagieren können.
Umtriebige Access-Entwickler verwenden Excel und Word als Reporting-Tools, packen Produktkataloge aus der Tabelle in die PowerPoint-Präsentation oder interagieren mit Outlook, um Mails zu versenden, Kontakte zu synchronisieren oder Termine zu koordinieren. Dazu öffnen sie meist eine neue Instanz der jeweiligen Anwendung (soweit möglich) oder greifen einfach auf eine bestehende zu. Sie erstellen neue Dokumente zum Füllen, öffnen bestehende Dokumente zum Auslesen oder ändern.
Starten und beenden, öffnen und schließen
Damit bei der Arbeit mit Office-Anwendungen, die per VBA automatisiert geöffnet wurden, keine Rückstände wie geöffnete Dokumente oder Anwendungen bleiben und andererseits keine Anwendungen geschlossen werden, die der Benutzer zuvor selbstständig geöffnet hat, kann man sich einiger Features der Objektmodelle der Office-Anwendungen bedienen. Dabei sollten Sie die folgenden Varianten berücksichtigen:
- Sie starten eine neue Instanz einer Anwendung. Dann sollten Sie diese auch anschließend wieder schließen.
- Sie verwenden eine bestehende Anwendung. Dann sollte diese anschließend nicht geschlossen werden, da der Benutzer sonst möglicherweise recht konsterniert wäre.
- Sie öffnen oder erstellen ein Dokument in einer Anwendung (egal, ob diese extra gestartet oder “gekapert” wurde): Dann schließen Sie das Dokument anschließend auch wieder.
Neue Instanz
Heutzutage sollte ein Rechner nicht mehr in die Knie gehen, nur weil eine zweite oder auch dritte Instanz von Word oder Excel geöffnet wurde. Daher empfehlen wir, gar nicht erst zu prüfen, ob eventuell bereits eine Instanz geöffnet ist, sondern gleich eine neue zu öffnen.
Da Sie in den meisten Fällen etwas per VBA mit der Instanz erledigen möchten, speichern Sie einen Verweis auf die jeweilige Anwendung in einer Objektvariablen, die zum Beispiel so aussieht (wir verwenden Word in diesem Beitrag als Beispielanwendung – für die übrigen Office-Anwendungen sieht dies aber ähnlich aus):
Dim objWord As Word.Application
Für diese Variante brauchen Sie einen Verweis auf die jeweilige Bibliothek (Extras|Verweise, dort Microsoft x y.0 Object Library anhaken – x durch Word, Excel, PowerPoint oder Outlook und y durch die Versionsnummer ersetzen, zum Beispiel 12 für Office 2007).
Wer ohne Verweis auskommen und somit eine höhere Wahrscheinlichkeit erzielen möchte, dass die Anwendung versionsübergreifend eingesetzt werden kann, verwendet diese Deklaration:
Dim objWord As Object
Dafür fallen aber Vorteile wie IntelliSense (automatisches Einblenden von Methoden und Eigenschaften im VBA-Editor) und die Verwendung von Konstanten weg. Unsere Empfehlung: Mit Verweis und Early Binding programmieren, vor Auslieferung Verweis rauswerfen und auf Late Binding umsteigen. Eine neue Instanz erstellen Sie mit den folgenden beiden Aufrufen für Early Binding und Late Binding:
Set objWord = New Word.Application Set objWord = CreateObject("Word.Application")
Ein neues Dokument erstellen Sie unter Word zum Beispiel mit folgender Anweisung. Die Objektvariable objDocument speichert den Verweis auf das Dokument:
Dim objDocument As Word.Document Set objDocument = objWord.Documents.Add
Es gibt noch andere Varianten und Sie können auch bestehende Dokumente öffnen, aber wir brauchen einfach nur einen Verweis auf irgendein Dokument. Wenn Sie einen Verweis auf ein Dokument besitzen, können Sie dieses auch kontrolliert schließen:
objDocument.Close
Diese Methode besitzt unter anderem einen Parameter namens SaveChanges, mit dem Sie angeben, ob änderungen gespeichert (True) oder das Dokument einfach so geschlossen werden soll (False).
Wenn Sie ein neues Dokument anlegen und dieses ohne änderung mit Close schließen, wird es übrigens nicht gespeichert.
Erst nach einer änderung des erzeugten Dokuments fragt Word nach dem Dateinamen und Speicherort. Um ein leeres Dokument zu speichern, müssen Sie explizit die Save– oder SaveAs-Methode verwenden.
Die Word-Instanz beenden Sie mit der Quit-Methode, die ebenfalls den Parameter SaveChanges anbietet. Anschließend sollten Sie Objektvariablen für Dokumente und Anwendungen leeren:
Set objDocument = Nothing Set objWord = Nothing
Für Excel und PowerPoint funktioniert obiges prinzipiell genauso, auch wenn die Objekte anders heißen.
Das Starten einer Excel-Instanz, das Erstellen eines Workbooks und das anschließende kontrollierte Schließen erfordert unter Early Binding beispielsweise die folgenden Schritte:
Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True Set objWorkbook = objExcel.Workbooks.Add objWorkbook.Close objExcel.Quit Set objWorkbook = Nothing Set objExcel = Nothing
Und Sie können dies, einen entsprechenden Verweis vorausgesetzt, auch mit PowerPoint durchführen:
Dim objPowerPoint As PowerPoint.Application Dim objPresentation As PowerPoint.Presentation Set objPowerPoint = CreateObject("PowerPoint.Application)" objPowerPoint.Visible = True Set objPresentation = objPowerPoint.Presentations.Add objPowerPoint.Quit Set objPresentation = Nothing Set objPowerPoint = Nothing
Überwachung
Es kann aber auch sein, dass Sie eine Office-Anwendung starten und ein Dokument öffnen, mit dem der Benutzer etwas erledigen soll. Nach der Durchführung dieser Arbeiten durch den Benutzer soll Access benachrichtigt werden, um beispielsweise ein neu erzeugtes Dokument in eine Liste aufzunehmen oder den Inhalt dieses Dokuments zu verarbeiten.