Word, Excel und Co. im Griff

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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.

In diesem Fall müssen Sie auf irgendeine Art und Weise auf das jeweilige Ereignis reagieren können. Schauen wir uns das Schließen einer Anwendung wie Word an.

Das Application-Objekt, auf das wir ja einen Verweis in einer Objektvariablen speichern können, bietet eine Reihe Ereignisse an, auf die man mit entsprechender Vorbereitung reagieren könnte. Die Ereignisse finden Sie schön übersichtlich im Objektkatalog (F2), wenn das VBA-Projekt einen Verweis auf die Word-Bibliothek enthält (siehe Bild 1).

pic001.png

Bild 1: Objektkatalog mit Word-Ereignissen

Der Umfang der Ereignisse ist in älteren Office-Versionen üblicherweise eingeschränkt, wir werden bei den hier vorgestellten Ereignissen jedoch auf Besonderheiten hinweisen.

Beenden abfangen

Im ersten Anlauf soll die Access-Anwendung es mitbekommen, wenn der Benutzer die von Access aus geöffnete Word-Anwendung schließt. Dabei reicht das einfache Erscheinen eines Meldungsfensters mit einem kleinen Hinweis.

Die notwendige Technik steht leider nur in Klassenmodulen zur Verfügung, aber nicht in Standardmodulen (auch Formular- und Berichtsmodule sind allerdings Klassenmodule).

Wir versuchen es der Einfachheit halber mit einem Formularmodul. Dazu statten wir ein neues Formular mit einer Schaltfläche namens cmdWordStarten aus, wodurch das Klassenmodul angelegt und mit einer leeren Ereignisprozedur gefüllt wird.

Diesem Klassenmodul fügen Sie nun zunächst eine Objektvariable zum Speichern des Verweises auf die Word-Instanz hinzu, wobei Sie das Schlüsselwort WithEvents verwenden:

Dim WithEvents objWord As Word.Application

Dies führt dazu, dass Sie im aktuellen Klassenmodul Ereignisprozeduren des Word-Objekts anlegen können. Den Beweis liefert ein Blick in die Kombinationsfelder zur Auswahl von Objekten und Methoden im Codefenster des VBA-Editors (siehe Bild 2).

Bevor wir das Ereignis Quit implementieren, erstellen wir zunächst ein neues Word-Objekt und machen es sichtbar:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar