Beitrag aus SmartTools Outlook Weekly
Outlook-Ereignisse in allen Fenstern überwachen, Teil 1
Outlook 365 2024 2021 2019 2016 2013
VBA-Lösungen sind immer dann besonders praktisch, wenn sie unbemerkt im Hintergrund ablaufen. Möglich machen das Ereignisprozeduren, die Outlook automatisch beim Eintreten bestimmter Situationen ausführt. Das könnte der Eingang einer E-Mail, das Wechseln des aktuellen Ordners oder das Verschieben eines Outlook-Elements in einen anderen Ordner sein. Es gibt allerdings einen Haken: Ereignisprozeduren beziehen sich üblicherweise nur auf das Hauptfenster von Outlook. In weiteren Fenstern bleiben sie häufig ohne Wirkung. Doch das muss nicht so sein. In diesem Tipp verraten wir die Tricks, mit denen Ihre Ereignisprozeduren in jedem Outlook-Fenster ausgeführt werden.
Konkreter Anlass für diesen Tipp waren kritische Anmerkungen zu einem Tipp aus einer früheren Newsletter-Ausgabe. Im Beitrag "Kontakte erst nach Rückfrage löschen" ging es darum, das versehentliche Löschen von Kontakten durch ein unbedachtes Drücken der Entf-Taste zu verhindern. Outlook verschiebt den Kontakt dann ohne Rückmeldung in den Ordner für "Gelöschte Elemente". Unsere Makrolösung greift mit Hilfe von Ereignisprozeduren in diesen Verschiebevorgang ein und schaltet eine Rückfrage vor. Gegebenenfalls lässt sich so das Löschen des Kontakts unterbinden.
Das funktioniert im Hauptfenster von Outlook problemlos. Aber wenn Sie zum Beispiel einen Kontaktordner in einem neuen Fenster öffnen (Rechtsklick auf den Ordnernamen und Aufruf des Befehls In neuem Fenster öffnen), bleiben die Ereignisprozeduren wirkungslos. Das ist kein Einzelproblem unserer Makrolösung, sondern ein generelles Problem von VBA-Lösungen, die sich auf die Standardereignisse – insbesondere von Explorer-Objekten – im Klassenmodul "ThisOutlookSession" verlassen.
Um sauber mit Explorer-Objekten und ihren Ereignissen zu arbeiten, müssen Sie ein wenig in die Trickkiste greifen. Das generelle Prinzip sieht so aus:
- Erstellen Sie Klassenmodule für alle Objekte, die Sie mit Ereignisprozeduren überwachen wollen.
- In den Klassenmodulen deklarieren Sie auf Modulebene Variablen für die zu überwachenden Objekte mit dem Zusatz "WithEvents".
- Definieren Sie die gewünschten Ereignisprozeduren in den Klassenmodulen.
- Initialisieren Sie die einzelnen Klassen in Standardereignissen aus dem Modul "ThisOutlookSession".
- Speichern Sie Verweise auf die Klasseninstanzen in Collection-Objekten.
Der letzte Punkt ist besonders wichtig, denn Outlook hat die unschöne Angewohnheit, benutzerdefinierte Objekte oder Klassen nach ihrer Initialisierung einfach wieder zu verwerfen, wenn sie nicht direkt gebraucht werden. Dem wirken Sie entgegen, indem Sie die Objekte/Klassen einem allgemein verfügbaren Collection-Objekt hinzufügen.
Ein Beispiel veranschaulicht die Vorgehensweise am besten. Wir nehmen dafür die oben beschriebene Makrolösung zum Verhindern einer versehentlichen Kontaktlöschung.
Wichtiger Hinweis für alle, die die Lösung aus unserem ursprünglichen Tipp bereits umgesetzt haben: Sie müssen den VBA-Code, den Sie dafür eingegeben haben, erst löschen, bevor Sie die folgenden Schritte ausführen!
Zuerst müssen Sie sich Gedanken machen, welche Objekte und Ereignisse überwacht werden sollen. Im Beispiel wollen Sie prüfen, ob ein Kontakt in den Ordner für "Gelöschte Elemente" verschoben wurde. Dafür müssen Sie wissen, welcher Ordner gerade aktiv ist. Das finden Sie heraus, indem Sie einen Ordnerwechsel im aktuellen Outlook-Fenster überwachen.
Folglich brauchen Sie ein Folder-Objekt (Ordner) mit dem "BeforeItemMove"-Ereignis (Element verschieben) und ein Explorer-Objekt (Outlook-Fenster) mit dem "FolderSwitch"-Ereignis (Ordnerwechsel). Für beide Objekttypen legen Sie Klassenmodule an, in denen Sie die gewünschten Ereignisprozeduren programmieren.
Den Code zu diesem Tipp können Sie als Textdateien herunterladen, deren Inhalt Sie in das VBA-Projekt von Outlook integrieren. Für die Folder-Klasse geht das so:
- Wechseln Sie mit Alt + F11 aus dem Outlook-Fenster in die Entwicklungsumgebung.
- Wählen Sie Einfügen-Klassenmodul an.
- Geben Sie dem neuen Klassenmodul einen eindeutigen Namen, indem Sie mit F4 ins Eigenschaftenfenster wechseln und im Feld (Name) in diesem Fall folgende Bezeichnung eingeben:
clsOrdnerInstanz
- In das Codefenster des Klassenmoduls fügen Sie den VBA-Code aus der Textdatei clsOrdnerInstanz.txt ein.
Im Code des Klassenmoduls deklarieren Sie auf Modulebene eine Objektvariable mit dem Zusatz "WithEvents", um Ereignisse des Folder-Objekts überwachen zu können.
Über die Dropdownfelder am oberen Rand des Codefensters können Sie dann für das Objekt (linkes Dropdownfeld) die gewünschte Ereignisprozedur (rechtes Feld) anlegen und anschließend mit Inhalten füllen.

Der Code der Ereignisprozedur "BeforeItemMove" prüft zunächst, ob der aktuelle Ordner ein Kontaktordner ist und ob das Ziel des Verschiebevorgangs der Löschordner des aktuellen Kontos ist. Das wäre der Fall, wenn ein Kontakt mit der Entf-Taste gelöscht worden wäre.
Nur in diesem Fall wird ein Meldungsfenster mit der Frage angezeigt, ob das gewollt ist. Ein Klick auf Nein kann das Verschieben in den Löschordner unterbinden.
Im nächsten Teil dieses Tipps stellen wir die restlichen VBA-Routinen vor. Denken Sie jetzt nur daran, das VBA-Projekt zu speichern. Outlook fragt Sie beim Beenden automatisch danach.