Outlook VBA

Sehr viele Aufgaben werden mit Outlook Formularen oder über Outlook VBScript erledigt. Aber bestimmte Funktionen von Outlook lassen sich auch in Outlook selbst über Visual Basic für Applications umsetzen. ähnlich den Makros in Word können Sie mit dem VBA-Editor (Aufruf in Outlook über ALT-F11) oder Extras - Makros können Sie in Outlook umfangreiche Lösungen entwickeln, die durch Funktionstasten oder eigene Symbole in der Taskleiste oder Menüeinträge von Anwendern aufgerufen werden können. Zudem gibt es einige "Systemfunktion", die Outlook aufruft, wenn Sie definiert sind.

Das auch Viren und andere Programme den Zugriff früher genutzt haben, hat Microsoft entsprechende Warnungen ergänzt. Siehe auch Outlook Sicherheitswarnung

Wichtiger Download: Die Objektmodelle von Outlook zur Nutzung in VBA Projekten.

Office 2003 Editions: Outlook VBA Language Reference http://www.microsoft.com/downloads/details.aspx?familyid=A1CEAD80-23E2-456F-8618-4DA50CC2C38C&displaylang=en

Sue Mosher hat einige ihrer Skripte aus den Büchern ins Internet gestellt:
http://www.outlookcode.com/member/jump2007.zip
http://outlookcode.com/member/jumpstart.zip
Die Skripte sind als "Notes" in den PST-Dateien abgelegt.

Auszug aus Programming Applications für Microsoft Office Outlook 2007
http://msdn.microsoft.com/en-us/library/cc513844(v=office.12).aspx
Chapter 2: Outlook as a Platform http://msdn.microsoft.com/en-us/library/cc513842(v=office.12).aspx
Chapter 7: Address Books and Recipients http://msdn.microsoft.com/en-us/library/cc513843.aspx
Chapter 11: Searching Outlook Data http://msdn.microsoft.com/en-us/library/cc513841(v=office.12).aspx
Chapter 13: Creating Form Regions http://msdn.microsoft.com/en-us/library/cc513845(v=office.12).aspx

Ten Tips für Office VBA Developers (February 2003) http://msdn.microsoft.com/en-us/library/aa163981(office.10).aspx

Programmieren mit VBA

Um Programme unter Outlook zu entwickeln, benötigen sie eine EntwicklungsUmgebung. Diese ist in Form des VBA-Editors Bestandteil von Office. Sie können diese Komponente vermutlich schon von Word, Excel und anderen Anwendungen. Hier geben Sie einfach den Code ein, der ihre Funktion umsetzen soll.

Der einzige unterschied zu Visual Basic ist, dass Sie keine selbst ablaufende Programme (EXE) kompilieren können, sondern für Ausführung immer Outlook erfordert.

Einbinden in Outlook

Die von ihnen entwickelten Funktionen können Sie dann aus Outlook Formularen, über VBScript und das Outlook Objektmodell oder direkt aus Outlook selbst aufrufen. Binden Sie dazu z.B.: einfach die Funktionen als Makro ein

Entsprechend können Sie das Makro auch in die Menüleiste oder Symbolleiste von Outlook integrieren. Sie müssen sich nur überlegen, wie Sie den Code eben zu jedem Anwender bringen

Funktionen, Methoden und Eigenschaften

Outlook stellt ihnen folgende Funktionen vordefiniert zur Verfügung:

  • Private Sub Application_Startup()
    Wird beim Start von Outlook einmalig aufgerufen. Entspricht also in etwa der Funktion einer Autostart Gruppe oder "RUN="-Zeile von Windows.
  • Private Sub Application_Quit()
    Wird beim beenden von Outlook aufgerufen.
  • Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Jedes Mal, wenn Sie eine Mail über "Senden" an Outlook übergeben, wird diese Funktion mit der Mail als Parameter aufgerufen. Sie können hier also sehr umfangreich die Mail noch verändern oder sogar den Versand verhindern. (Siehe Beispiel am Ende)
  • Private Sub Application_MAPILogonComplete()
    Diese Funktion wird aufgerufen, wenn die Anmeldung an MAPI abgeschlossen ist.
  • Private Sub Application_NewMail()
    Private Sub Application_NewMailEx()
    Diese beide Funktionen werden beim Eintreffen einer neuen Nachricht aufgerufen. Sie können hier z.B. eine automatische Verarbeitung von Nachrichten einrichten, die um ein Vielfaches flexibler ist, als eine Regel. So können Sie aus VBA auch Word starten etc. Allerdings funktioniert dies eben nur, wenn Outlook gestartet und angemeldet ist.
  • Private Sub Application_Reminder()
    Diese Funktion wird gestartet, wenn Outlook eine Erinnerung anzeigen wird. Sie könnten also auch hier eigene Funktionen ergänzen
  • Private Sub Application_OptionsPagesAdd(ByVal Pages As PropertyPages)
  • Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
    Private Sub Application_AdvancedSearchStopped(ByVal SearchObject As Search)
    Über diese Funktionen können Sie die Ergebnisse einer erweiterten Suche für eigene Zwecke weiter verwenden.

Wenn Sie daher eine Funktion mit diesen Namen definieren, dann wird diese von Outlook beim Eintreffen des Ereignisses direkt ausgeführt. Wenn Sie andere Funktionsnamen wählen, werden diese nicht eigenständig gestartet, sondern sind als Makro ausführbar.

Um jedoch nun Code zu schreiben, müssen Sie wissen, welche Objekte und Methoden ihnen zur Verfügung stehen. Hier hilft ihnen das Outlook Objekt Modell weiter, welches ihnen zeigt, welche Objekte mit welchen Methoden und Attributen verfügbar sind. Sie sollten Sie daher unbedingt das Outlook Objekt Modell aus der MSDN oder eine der Dateien von  http://www.outlookexchange.com/articles/home/outlookobjectmodel.asp laden und ausdrucken.

Eine weitere Quelle ist einfach eine Suche in einer Internet Suchmaschine z.B. nach den Funktionsnamen. Damit erhalten Sie ebenfalls sehr viel Codebeispiele.

Beispiel

Folgende Zeilen Code in Outlook hinterlegt werden immer aufgerufen, wenn ein Anwender eine Mail versenden will. Der Code prüft, ob im Body der Begriff "Anlage" vorkommt. Ist dies der Fall und es ist keine Anlage beigefügt, wird der Anwender gefragt. Der zweite Test stellt sicher, dass der Betreff nicht leer ist.

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim ans
    If InStr(1, Item.Body, "Anlage", vbTextCompare) > 0 Then
        If Item.Attachments.Count = 0 Then
            ans = MsgBox("Anlage fehlt, Trotzdem senden?", vbYesNo)
            If ans = vbNo Then Cancel = True
        End If
    End If
    If Item.Subject = "" Then
        MsgBox "Bitte einen Betreff vergeben"
        Cancel = True
    End If
'    Call DoSync
End Sub

Über die Rückgabe des Wertes "Cancel" können Sie sogar Outlook mitteilen, dass es die Mail nicht senden soll. Der Anwender kommt dann wieder in die "Verfassen"-Maske zurück und kann seinen Fehler korrigieren.

  • 823917 Recipients do not receive your e-mail message when you set the Recipients.Type property to olOrignator (0) in Outlook

Versuchen Sie es einfach:

  • Starten Sie Outlook und dann den VBA Editor mit ALT-F11
  • Kopieren Sie den Code einfach in das Eingabefenster und beenden Sie den Editor wieder.
  • Nun verfassen Sie eine Mail ohne Betreff und drücken auf Senden.
  • Das Skript zeigt die Mitteilung an, dass Sie einen Betreff vergeben müssen und Sie müssen die Mail bearbeiten.

Das ist natürlich nur ein erster Anfang. Genauso einfach können Sie auf neue Mails reagieren:

Private Sub Application_NewMail()
   ' Holt die erste ungelesene Mail und tut was damit
    Dim olFld As Outlook.MAPIFolder
    Set olFld = Outlook.Session.GetDefaultFolder(olFolderInbox)
    olFld.items.Sort "[ReceivedTime]", False
    
    Dim oMail As Outlook.MailItem
    Set oMail = olFld.items.GetFirst
    
    ' Hier kann man dann alles mit der Mail weiter anfangen
    MsgBox "Newmail:" & oMail.subject
    
    Set oMail = Nothing
    Set oFld = Nothing
End Sub

Der Code startet aber nur dann, wenn Outlook auch gestartet ist.

VBA und Betriebssystemfunktionen

Auch wenn das Objektmodell von Outlook quasi den kompletten Zugriff auf das Postfach erlaubt, so sind das ein oder andere Mal auch Zugriffe auf Funktionen anderer Module erforderlich. Dazu muss die entsprechende Funktion einfach deklariert werden. Hier am Beispiel einer einfachen Funktion zum Anhalten der Ausführung:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMS As Long)
Sleep 20

Erst die Deklaration und danach kann die Funktion einfach genutzt werden.

Einen Ordner auswählen

Oft möchte man "mal schnell" in einem bestimmten oder ausgewählten Ordnern auf alle Objekte eine bestimmte Änderung durchführen. Ehe man nun lange den Pfad zu dem Ordner "codiert" kann man sich auch den Ordner-Picker heranziehen, damit der Anwender interaktiv einen Ordner auswählen kann.

Dim ns As Outlook.NameSpace
Set ns = GetNamespace("MAPI")

Dim Folder As Outlook.MAPIFolder
Set Folder = ns.PickFolder

Dim item As Outlook.Mailitem für Each item In Folder.Items
	debug.print item.subject
next
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMS As Long)
Sleep 20

Natürlich ist dies nur ein Kurzbeispiel ohne Rücksicht auf die verschiedenen Objekte. Wenn man einen Kontaktordner auswählt, muss man natürlich "Outlook.Contactitem" schreiben und dann noch auf Verteiler in Kontaktordner aufpassen etc.

Per VBA alle Objekte verändern

Man kann per VBA natürlich auch schnell mal Massenänderungen durchführen. Ein VBA-Skript ist schnell entwickelt und ausgeführt, wenn Sie Outlook eh offen haben. Hier ein Beispiel, um alle Objekte in einem auszuwählenden Ordner "anzufassen".. So können Sie z.B. eine komplette Replikation der Objekte erzwingen.

Option Explicit

Sub TouchObjects()
' Fasst jedes Element kurz an und ändert ein Feld kurzfristig
' Zwingt Clients zu einer Replikation (z.B. ActiveSync)
' Einschränkung bei PF kann man den Zielserver nicht vorgeben
    Dim ns As Outlook.NameSpace
    Set ns = GetNamespace("MAPI")
    
    Dim Folder As Outlook.MAPIFolder
    'Set Folder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts)
    Set Folder = ns.PickFolder
    Debug.Print "FolderPath:" & Folder.FolderPath

    Dim item für Each item In Folder.items
        Debug.Print "Touch Item:" & item.Subject
        item.Subject = item.Subject
        item.Save
    Next
    
    Set ns = Nothing
    Set item = Nothing

End Sub

Einfach in den Outlook CodeEditor als neues Modul einbinden und starten. In die gleiche Kategorie fällt auch das Tool "Kontaktrename" welches die Kontakte im Ordner zu umbenennt, dass Sie auf einem Smartphone auch korrekt im Telefon angezeigt werden

Anlagen mit VBA extrahieren

Nicki Wruck hat mir sein Script mit Dokumentation zur Veröffentlichung bereit gestellt, mit welchem Sie ihr Outlook Postfach "verkleinern" können. Das Makro extrahiert die Anlagen an ihren Nachrichten und speichert diese in einem Verzeichnis. Die Mail wird dahingehend geändert, dass dort ein Link auf das ausgelagerte Dokument vorhanden ist.

wruck-outlook_anhaenge_isolieren.pdf  Anleitung als PDF
wruck-outlook_anhaenge_isolierenvba.zip VBA Makros

Damit bleibt eine PST-Datei klein bzw. ein Exchange Store. Allerdings funktionieren die Stellvertreterfunktionen und Offline Ordner natürlich dann nicht mehr.

Outlook DLLs

Natürlich können Sie Outlook selbst auch mit DLLs erweitern. Dies machen z.B.: Archivlösungen, PGP, Packer, Virenscanner und vieles mehr. Mit dieser Option habe ich mir selbst bislang aber nicht aktiv beschäftigt. Daher kann ich hier nur ein paar Links anbieten:

Wenn Sie DLLs und AddIns permanent oder temporär abschalten wollen, dann finden Sie die Verbindungen an folgenden Stellen in der Registrierung:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Outlook\Addins
HKEY_CURRENT_User\SOFTWARE\Microsoft\Office\Outlook\Addins
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Exchange\Client\Extensions

Ein Deaktivieren beim Start mit gedrückter CTRL-Taste scheint nicht alle AddIns zu stoppen.

In Outlook 2007 finden Sie die deaktivierten Elemente dann im Hilfe Menü.
Outlook 2007 deaktivierte Elemente

Weitere Links