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:
- Outlook 2007 Sample: Visual Studio 2005 Templates
http://go.microsoft.com/?linkid=6341796
Vorlagen für die Entwicklung von Outlook 2007 Add-ins mit Visual Studio 2005.
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ü.
Weitere Links
- Outlook VBScript
- Outlook Sicherheitswarnung
- Kontaktrename - Kontakte "PDA-Tauglich" umbenennen
- Dubletten - Doppelte Einträge per Outlook VBA finden und entfernen
- MoveSubFolder - Große Ordner in Unterordner aufteilen
- Kontaktfelder - Programmieren mit Outlook VBA und Kontakten
- OLK-Itemcount - VBA Makro um die Ordner und die Anzahl der Elemente aufzuzählen
- 166368 OL97: How to Get Help Programming with Outlook
- 166780 OL97: Why Outlook Displays a Security Warning Opening an Item
- 170783 OL97: Q&A: Questions About Customizing or Programming Outlook
- 201095 OL: How to use CommandBars in Outlook Solutions
- 208520 OL2000: Programming Examples für Referencing Items and Folders
- 290498 You receive warning messages when you use a third-party add-in or custom solution in Outlook 2002
- 290499 Administrator information about e-mail security features
- 290500 OL2002: Developer Information About E-Mail Security Features
- 290658 OL2002: How to Programmatically Import Outlook Items from Microsoft Access
- 290792 OL2002: How to Programmatically Export Outlook Items to Microsoft Access
- 292176 OL2002: VBA Code Does Not Run, or Causes Security Warning to Appear
- 295302 Summary of Collaboration Data Objects (CDO) 1.21s e-mail security features in Outlook 2002
- Outlook Object Modell
http://www.outlookexchange.com/articles/home/outlookobjectmodel.asp - Outlook Sample Pages
http://www.outlookexchange.com/articles/home/outlookcodeexample.asp - http://msdn.Microsoft.com/library/en-us/vbaol10/html/olobjApplication.asp
- Microsoft Windows 2000 - Scripting-Handbuch (Teil 1)
Scripting-Konzepte und -Technologien zur Systemadministration: Überblick
http://www.Microsoft.com/germany/technet/datenbank/articles/600356.mspx - Microsoft Office Makros per Gruppenrichtlinie (GPO) abstellen zum Schutz
vor Ransomware wie Locky und Cryptolocker
https://www.matthias-staud.de/2016/03/microsoft-office-makros-per-gruppenrichtlinie-gpo-abstellen-zum-schutz-vor-ransomware-und-anderen-schaedlingen/ - Makros in Office 2016 / 2019 einschränken oder blockieren mit
Gruppenrichtlinien
https://www.windowspro.de/wolfgang-sommergut/makros-office-2016-2019-einschraenken-blockieren-gruppenrichtlinien - Michael Bauer, MVP
www.vboffice.net
Liste von über 61 VBA Beispielen
http://www.vboffice.net/sample.html?cmd=list&mnu=2 - Beispielskripte
http://www.outlookexchange.com/articles/home/outlookcodeexample.asp - Outlook 2003 IMAP Aufräummakro, Version 1.2
http://www.staudte-edv.de/Kunden/IMAPcleanup.asp
Outlook VBA, welches bei IMAP4 Zugriff "gelöschte Mails" beim Verlassen den Ordner auch löscht. - Microsoft Office Outlook 2003 Book Excerpts - Microsoft Office Outlook
2003 Inside Out - Companion CD Content: using VBA in Outlook
http://msdn2.microsoft.com/en-us/library/aa218785(office.11).aspx - Regeln als VBA in Outloook
292063 How to create a custom rule using Visual Basic für Applications (VBA) in Outlook 2002 - c't 8/2006
Auch in der c't war ein netter Artikel mit einem Projekt, um z.B.: Dateien zu packen und anzuhängen.
Softlink 0608186 bzw. http://www.heise.de/ct/ftp/06/08/186/ - VBA Skripte mit Timer regelmäßig starten
http://www.vboffice.net/sample.html?mnu=2&pub=5&smp=4&cmd=showitem - c't 4/2009 Softlink 0904172: VisualBasic-Skript Geburtstag.bas
ftp://ftp.heise.de/pub/ct/listings/0904-172.zip
ändert die Geburtstagserinnerungen - Preparing your Existing Solutions to Run on Outlook 2010
http://blogs.msdn.com/b/officedevdocs/archive/2009/12/11/preparing-your-existing-solutions-to-run-on-outlook-2010.aspx