VBOffice

VBA-Editor: Erste Schritte

So öffnen Sie die VBA-Umgebung von Microsoft Outlook und fügen Makros in DieseOutlookSitzung ein.

Zuletzt geändert: 13.01.2017 | Aufrufe: 334.938  | #5
◀ Vorheriger Artikel Nächster Artikel ▶

Inhalt

ReplyAll 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.

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.

Wo füge ich Makros ein?

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 VBA-Beispiele. (In den wenigen Ausnahmen, wo Code in ein anderes Modul gehört, werden Sie darauf besonders hingewiesen.)

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.

Wie starte ich ein Makro?

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 Sub
Richtig:
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 Sub
Richtig:
Public Sub Beispiel(Object As MailItem)
  'Diese Funktion kann nur für Emails aufgerufen werden
End Sub
Oder:
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
SAM 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.

Ereignis-Prozeduren

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:

  • Über dem Code-Bereich befinden sich zwei Auswahllisten. Klicken Sie mit der Maus auf die linke und wählen Sie Ihre Variable MyExplorer.
  • In der rechten Liste sehen Sie alle Ereignisse, die vom Explorer-Objekt angeboten werden. Wählen Sie den Eintrag SelectionChange.

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.

Reporter Reporter
Mit dem Reporter erstellen Sie Berichte für Ihre Outlook Daten. Mit wenigen Klicks werden Werte aus Aufgaben, Terminen und dem Journal summiert.

Application_Startup

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.

Initialize_Handler

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
ReplyAll 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.

Makros kopieren

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
OLKeeper OLKeeper
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schließen und so etwa wichtige Emails verpassen würden.

Makros werden nicht ausgeführt

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:

  1. Das Programm muss noch initialisiert werden.
  2. Die Sicherheitseinstellungen erlauben nicht die Ausführung von VBA-Code

Code initialisieren

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.

Makro-Sicherheitseinstellungen

Je nach Outlook-Version finden Sie die Einstellungen hier:

  • Outlook 2007 und früher: Extras/Vertrauensstellungscenter/Makrosicherheit
  • Outlook 2010 und später: Datei/Optionen/Sicherheitscenter/Einstellungen für das Sicherheitscenter/Einstellungen für Makros/

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.

Weitere Einstellungen anpassen

Die Standardeinstellungen des VBA-Editors erschweren Ihnen das Arbeiten unnötig. Zum Ändern klicken Sie auf Extras/Optionen und nehmen folgende Einstellungen vor:

  • Variablendeklaration erforderlich: Setzen Sie den Haken, und fortan wird in die erste Zeile jedes neuen Code-Moduls die Anweisung Option Explicit geschrieben. Leider gilt das nicht für schon vorhandene Module, wie z.B. DieseOutlookSitzung; schreiben Sie den Eintrag deswegen ggf. manuell ganz oben ins Modul, also die allererste Zeile.
    Die Einstellung bewirkt, dass eine Funktion erst ausgeführt werden kann, wenn alle Variablen deklariert wurden. Diese Einstellung ist selbst für erfahrene Entwickler hilfreich und bewahrt Sie vor so manchem, schwer auffindbaren Fehler.
  • Automatische Syntaxüberprüfung: Auf diese Option können Sie ruhig verzichten (entfernen Sie den Haken). Andernfalls können Sie den Cursor aus keiner Code-Zeile wegbewegen, solange diese einen Syntaxfehler enthält, wodurch das Programmieren unnötig behindert wird. Spätestens vor Ausführung einer Funktion werden Sie sowieso auf Syntaxfehler aufmerksam gemacht. Sie können die Syntaxüberprüfung aber auch manuell über Debuggen/Kompilieren starten.
Category-Manager Category-Manager
Mit dem Category-Manager können Sie Outlook Kategorien gruppieren, synchronisieren und filtern, neuen Emails automatisch die Kategorie des Absenders zuweisen und vieles mehr. Das Addin ist auch für IMAP geeignet.

Fehlersuche

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.

Fehlersuche

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.

Fehlersuche

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':

Fehlersuche

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.

Fehlersuche

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:

Fehlersuche

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:

Fehlersuche

Fehler beheben

ReplyAll 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.
◀ Vorheriger Artikel ▲ Seitenanfang Nächster Artikel ▶