Inhalt
SAM | |
Legen Sie fest, mit welcher "Identität" Ihre Emails beim Empfänger erscheinen sollen. Mit SAM bestimmen Sie den Absender und Speicherort für Emails anhand von Regeln. |
Der VBA-Editor ist die Entwicklungsumgebung für Ihre eigenen VBA-Funktionen. Zum Ãffnen drücken Sie in Outlook ALT+F11. Drücken Sie dann noch ggf. STRG+R, um den Projektexplorer anzuzeigen. Dieser listet alle zum Projekt gehörenden Module auf.
Zu Beginn gibt es nur das Modul DieseOutlookSitzung, das Sie unter Projekt1/Microsoft Office Outlook Objekte sehen. Mit einem Doppelklick auf den Eintrag öffnen Sie das Modul im Code-Fenster. In dieses Modul können Sie alle Makros kopieren. Das betrifft z.B. alle von uns angebotenen
Da ein Code-Modul beliebig viele Funktionen oder Makros aufnehmen kann, wird Ihnen in der Regel dieses eine Modul ausreichen. Wenn Ihre Code-Sammlung anwächst, kann es sinnvoll werden, zusammengehörende Funktionen in separate Module zu verschieben. Damit können Sie die Ãbersicht verbessern, technisch notwendig ist das allerdings nicht.
Im Prinzip gibt es drei Möglichkeiten, ein Makro zu starten. Jede erfordert die Einhaltung bestimmter Regeln:
Art des Aufrufs | Wo den Code eingefügen? | Regeln für Deklaration |
---|---|---|
Manueller Aufruf, z.B. über ALT+F8 oder eine eigene Schaltfläche | Der Code darf im Modul DieseOutlookSitzung oder einem Standardmodul platziert werden. | Die Funktion muss öffentlich (Public) sein und darf keine Argumente entgegennehmen.
Falsch: Private Sub Beispiel(Argument) End SubRichtig: Public Sub Beispiel() End Sub |
Start durch den Regel-Assistenten, wenn eine eintreffende Email bestimmte Kriterien erfüllt | Der Code darf im Modul DieseOutlookSitzung oder einem Standardmodul platziert werden. | Die Funktion muss öffentlich (Public) sein und muss ein Argument entgegennehmen. Wenn Sie die Regel für eine Email erstellt haben, muss das Argument vom Typ MailItem sein; für eine Besprechungsanfrage muss es vom Typ MeetingItem sein.
Falsch: Private Sub Beispiel() End SubRichtig: Public Sub Beispiel(Object As MailItem) 'Diese Funktion kann nur für Emails aufgerufen werden End SubOder: Public Sub Beispiel(Object As MeetingItem) 'Diese Funktion kann nur für Besprechungsanfragen aufgerufen werden End Sub |
Aufruf durch ein Ereignis, z.B. Ãffnen einer Email oder Klick auf Senden | Der Code muss im Modul DieseOutlookSitzung oder einem Klassenmodul platziert werden (UserForms sind auch Klassenmodule). | Erläuterungen hierzu finden Sie im nächsten Abschnitt Ereignisse |
OLKeeper | |
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schlieÃen und so etwa wichtige Emails verpassen würden. |
Ein Ereignis wäre z.B. das Klicken auf Senden (Send) oder die Auswahl einer Email in der Ordneransicht (SelectionChange). Wenn Outlook Ihr Makro aufrufen soll, sobald ein bestimmtes Ereignis auftritt, dann müssen Sie das Makro dafür sozusagen anmelden. Das geschieht, indem Sie eine Variable vom passenden Objekttypen mit dem Schlüsselwort WithEvents deklarieren. Das SelectionChange-Ereignis gehört zum Explorer-Objekt (der Explorer ist für die Darstellung von Ordnern zuständig), also lautet der Typ Explorer. Vollständig sieht die Variablendeklaration dann so aus:
Private WithEvents MyExplorer As Explorer
Jetzt können Sie die Deklaration der SelectionChange-Funktion ganz einfach von Outlook erstellen lassen:
Outlook erstellt jetzt den Rumpf, und Sie können Ihren Code zwischen die Zeilen Sub... und End Sub schreiben.
Als nächstes müssen Sie noch die Variable initialisieren, also mit Leben füllen. Das geschieht in der Application_Startup-Ereignisfunktion.
ReplyAll | |
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten. |
Die Ereignis-Funktionen des Application-Objekts sind die einzigen, die Outlook selbständig aufrufen kann. Wenn es beim Start etwas zu initialisieren gibt, dann geht das nur in Application_Startup. Und damit Outlook diese Funktion finden kann, muss die sich zwingend im Modul DieseOutlookSitzung befinden.
Sie können die Funktionsdeklaration wieder einfach von Outlook erstellen lassen. Der einzige Unterschied zum Beispiel oben (Explorer-Objekt) ist, dass Sie keine Variable für das Application-Objekt deklarieren müssen. Diese eine Variable kennt Outlook automatisch. Sie klicken also wieder in die linke Liste, wählen dort Application und dann rechts Startup.
Im obigen Abschnitt Ereignisse haben Sie eine Variable deklariert, um die Ereignisse eines Explorer-Objekts empfangen zu können. Nun muss in der Variable noch der Verweis auf einen Explorer gespeichert werden. Schreiben Sie einfach folgende Zeile in das Startup-Ereignis:
Set MyExplorer = Application.ActiveExplorer
Damit wird Ihre Variable beim Start auf den aktuellen Explorer gesetzt und ab dann kann Outlook Ihre Ereignisprozedure aufrufen, im Beispiel also das SelectionChange-Ereignis, wenn die Auswahl in der Ordneransicht geändert wird.
In vielen Beispielen der VBA-Hilfe wird die Methode Initialize_Handler() als Startpunkt genannt. Diese Beispiele sind meistens unvollständig und der Name ist irreführend. Outlook kennt die Funktion nicht, kann die also auch nicht selbständig aufrufen.
Wenn Sie solch ein Beispiel aus der VBA-Hilfedatei übernehmen, dann müssen Sie entweder den Namen Initalize_Handler durch Application_Startup ersetzen, den Code aus Initialize_Handler nach Application_Startup verschieben oder Initialize_Handler aus Application_Startup aufrufen:
Sub Application_Startup() 'Nächste Funktion aufrufen: Initialize_Handler End Sub Sub Initialize_Handler() 'Aufruf kam aus Application_Startup. Hier können nun 'weitere Arbeiten durchgeführt werden End Sub
OLKeeper | |
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schlieÃen und so etwa wichtige Emails verpassen würden. |
Für vieles gibt es bereits fertige Makros, die Sie nur zu kopieren brauchen. Was aber tun, wenn Sie zwei verschiedene Makros verwenden wollen, die beide z.B. die Application_Startup-Funktion brauchen? Das Problem ist, dass es einen Funktionsnamen immer nur einmal in einem Modul geben darf, und Variablendeklarationen auÃerhalb von Funktionen müssen ganz oben im Modulkopf stehen. Folgende zwei Beispiele können Sie also nicht einfach untereinander in DieseOutlookSitzung einfügen:
Private Inbox as MapiFolder Sub Application_Startup() Set Inbox = Application.Session.GetDefaultFolder(olFolderInbox) End Sub
Private Calendar as MapiFolder Sub Application_Startup() Set Calendar = Application.Session.GetDefaultFolder(olFolderCalendar) End Sub
Die Lösung sieht so aus, dass Sie die Variablendeklaration aus dem zweiten Beispiel nach oben und die Code-Zeilen aus der zweiten Startup-Prozedur in die erste verschieben:
Private Inbox as MapiFolder Private Calendar as MapiFolder Sub Application_Startup() Set Inbox = Application.Session.GetDefaultFolder(olFolderInbox) Set Calendar = Application.Session.GetDefaultFolder(olFolderCalendar) End Sub
SAM | |
Legen Sie fest, mit welcher "Identität" Ihre Emails beim Empfänger erscheinen sollen. Mit SAM bestimmen Sie den Absender und Speicherort für Emails anhand von Regeln. |
Jetzt haben Sie alles befolgt, der Code befindet sich höchstwahrscheinlich in DieseOutlookSitzung und ein Klick auf Debuggen/Kompilieren bringt keine Fehlermeldungen. Trotzdem startet Outlook Ihre Funktionen nicht automatisch. Dafür gibt es zwei wahrscheinliche Ursachen:
Im Beispiel haben wir eine Ereignisprozedur für einen Explorer erstellt. Die Variable MyExplorer befindet sich im Modulkopf, d.h. auÃerhalb von Prozeduren und wird erst in Application_Startup auf einen gültigen Wert gesetzt, was beim Start von Outlook automatisch geschieht. Wenn Sie danach Ãnderungen am Code vornehmen, wird die Variable automatisch auf Nothing zurückgesetzt. Für eine erneute Initialisierung müssen Sie also wieder Outlook starten oder die Startup-Prozedur manuell starten. Letzteres machen Sie einfach, indem Sie den Cursor innerhalb der Funktion platzieren und z.B. F5 drücken.
Der Einfachheit halber kann man sagen: Immer wenn Ihr Programm die Funktion Application_Startup benötigt, müssen Sie diese nach jeder Code-Ãnderung erneut ausführen.
Je nach Outlook-Version finden Sie die Einstellungen hier:
Die vier Optionen sind von oben nach unten mit absteigender Sicherheit aufgelistet. Damit VBA ausgeführt wird, müssen Sie eine der unteren drei Optionen wählen. Wenn Sie kein Zertifikat haben, um das Projekt zu signieren, dann bleiben nur die letzten beiden Optionen.
Die Standardeinstellungen des VBA-Editors erschweren Ihnen das Arbeiten unnötig. Zum Ãndern klicken Sie auf Extras/Optionen und nehmen folgende Einstellungen vor:
Reporter | |
Mit dem Reporter erstellen Sie Berichte für Ihre Outlook Daten. Mit wenigen Klicks werden Werte aus Aufgaben, Terminen und dem Journal summiert. |
Wenn bis hierhin alles ok ist aber das Makro nicht das tut, was Sie erwarten, dann liegt wahrscheinlich ein logischer Fehler vor. In diesem einfachen Beispiel soll ein 'ok' ins Debug-Fenster gedruckt werden, wenn der Betreff einer Email gleich 'abc' ist. Stattdessen druckt das Makro aber 'error' und Sie wollen nun herausfinden, warum das so ist. Eine einfache Möglichkeit, den Fehler zu finden ist, Schritt für Schritt durch die Programmausführung zu gehen und zu beobachten, was passiert. Setzen Sie als erstes einen Haltepunkt am Anfang des Makros, indem Sie den Cursor auf die betreffende Zeile setzen und dann f9 drücken. Die ganze Zeile wird jetzt rot hervorgehoben.
Haltepunkt setzen
Jetzt starten Sie das Makro. Wenn es ein Ereignis ist, das von Outlook ausgelöst wird, z.B. bei Eintreffen einer neuen Email, dann senden Sie sich eine Email, damit Outlook das Makro startet. Ansonsten können Sie es in der Regel mit f5 starten. Die Codeausführung wird dann am Haltepunkt automatisch stehenbleiben. Die Zeile, wo die Codeausführung gerade steht, wird gelb hervorgehoben.
Codeausführung hält am Haltepunkt
Von jetzt an können Sie durch Drücken von f8 das Makro Zeile für Zeile abarbeiten. Im nächsten Schritt vergleicht das Makro den Betreff der Email mit dem erwarteten Wert 'abc':
Bedingung prüfen
Statt das 'ok' zu drucken, geht die Ausführung dann aber in den Else-Zweig. Sie wissen jetzt, dass die Bedingung (If ... Then ...) nicht erfüllt wurde.
Bedingung nicht erfüllt
Jetzt bewegen Sie den Cursor über die Eigenschaft, die in der Bedingung geprüft wurde, also über das Wort 'Subject'. Nach einer Sekunde wird Ihnen in einem Tooltip-Fenster der Inhalt der Eigenschaft angezeigt:
Inhalt der Eigenschaft prüfen
Sie sehen nun, dass der Betreff der Email 'Abc' lautet und nicht 'abc' wie erwartet. Jetzt wissen Sie, wo der Fehler in Ihrem Makro liegt: Sie haben übersehen, dass hier die GroÃ-/Kleinschreibung berücksichtigt wird. Wenn die für Ihr Makro aber keine Rolle spielen soll, ist die Lösung ganz einfach: Da Sie im Voraus selten wissen, ob der Betreff einer Email groÃe und kleine Buchstaben enthalten wird, wandeln Sie den ganzen Betreff in kleine Buchstaben um. Das geht mit der LCase-Funktion:
Fehler beheben
SAM | |
Legen Sie fest, mit welcher "Identität" Ihre Emails beim Empfänger erscheinen sollen. Mit SAM bestimmen Sie den Absender und Speicherort für Emails anhand von Regeln. |