Das Vorgehen, um Outlook zu automatisieren, unterscheidet sich mit dem nur geringfügig vom üblicherweise dafür eingesetzten. Um irgendwelche Aktionen ausführen zu können, benötigt man die laufende Instanz von Outlook und Zugriff auf dessen Application-Objekt. Es gibt zwei Möglichkeiten unter VBA: - Einen Verweis auf die "Microsoft Outlook Library x.0" anlegen und das Application-Objekt so erzeugen: Set objoutlook = New Outlook.Application. Hier handelt es sich um so genanntes Early Binding - Das Application-Objekt direkt über die so genannte ProgID - das ist die Klassenbezeichnung eines Objekts - erzeugen. Das wäre: Set objoutlook = CreateObjekt("Outlook.Application"). Hier handelt es sich um Late Binding. Die letztere Variante ist grundsätzlich zu bevorzugen. Wenn Outlook etwa auf dem Zielsystem gar nicht installiert ist oder in einer anderen Version vorliegt, so bekommt man Probleme mit dem VBA-Verweis, der dann als "NICHT VORHANDEN" markiert sein wird, und das gesamte VBA-Projekt kann möglicherweise nicht mehr ausgeführt werden. Im Folgenden deshalb ausschließlich die Darstellung der zweiten Methode. Eine Prozedur zur Automation sieht nun so aus: Sub OhneConnector() Dim objol As Object 'Variable für das Outlook.Application-ObjektOn Error Resume Next Set objol = CreateObject("Outlook.Application") Hier wird die Application-Variable instanziert. Zu bemerken ist hier, dass es egal ist, ob Outlook bereits geöffnet ist oder nicht. Da Outlook eine so genannte Multi-Use-Anwendung ist, gibt Cre ateobject eine bereits laufende Outlook-Instanz zurück und erzeugt nicht eine neue. Es verhält sich also faktisch genauso wie GetObject(, "Outlook.Application"). If objol Is Nothing Then MsgBox "Instanz von MSOutlook konnte nicht erhalten werden." & vbcrlf & _ "Ist Outlook korrekt installiert?", vbexclamation In diesem Teil wird geschaut, ob die Application-Variable auch gefüllt ist. Falls Outlook auf dem System nicht installiert ist, dann ist die Variable leer, was durch den Test auf objol Is Nothing 1 / 5
ermittelt wird. In diesem Fall erfolgt eine benutzerdefinierte Meldung und die Prozedur wird verlassen. Andernfalls kann ab hier mit weiterem Code fortgefahren werden, der beliebige Aufgaben auf das Outlook.Application-Objekt ( objol ) ausführt wie z.b. das Auslesen von Kontakten ( ContactItems ), das Exportieren und Senden von Emails ( MailItems ) oder das Anlegen von Aufgaben ( TaskItems ). Davor setzen wir aber noch eine Fehlerbehandlung ein, denn eingangs der Prozedur hatten wir sie mit der Zeile On Error Resume Next außer Kraft gesetzt: On Error Goto Fehlerbehandlung... Fehlerbehandlung: Msgbox "Fehler Nummer " & Err.Number & _ vbcrlf & Err.Description, vbexclamation Das mit gutem Grund: Wird Outlook nach vorstehendem Code automatisiert, dann wird die Sicherheitsabfrage von Outlook erscheinen, die bestätigt werden muss - meist nach der zweiten Aktion, etwa der zweiten exportierten Email - Outlook scheint gutmütigerweise nur eine einzige Email durchgehen zu lassen, ohne dass der Sicherheitsdialog erscheint. Wird die Sicherheitsabfrage nicht bestätigt, sondern stattdessen die Abbrechen-Schaltfläche geklickt, so wird dies im Code oben zu einem Fehler führen, der die Nummer 287 hat. Dieser Fehler wird in der Fehlerbehandlung abgefangen. Wird der eingesetzt, dann ist das ganze Verfahren im Prinzip dasselbe, nur dass hier die Instanzierung der Application-Variable anders aussieht: Sub MitConnector() Dim objol As Object Dim objconnect As ObjectOn Error Resume Next Set objol = CreateObject("Outlook.Application") If objol Is Nothing Then MsgBox "Instanz von MSOutlook konnte nicht erhalten werden." & vbcrlf & _ "Ist Outlook korrekt installiert?", vbexclamation Bis hierhin ist der Code derselbe wie im ersten Beispiel. Nun kommt der ins Spiel: Set objconnect = GetObject(, ".Connect") 2 / 5
Wenn der als COM-Addin in Outlook geladen wurde, was automatisch der Fall sein sollte, wenn er im System korrekt installiert, also registriert wurde, dann steht die Objektvariable objconnect nun auf dem Connect-Objekt des OLConn ector. Das wird im Folgenden aber erst noch geprüft: If objconnect Is Nothing Then Set objol = Nothing MsgBox "Konnte keine Verbindung zum herstellen." & vbcrlf & _ "Ist das COM-Addin registriert" & _ " und wird es von Outlook geladen?", vbexclamation Wenn der etwa nicht registriert und folglich auch nicht von Outlook geladen wurde, dann ist die Variable objconnect leer; mit dem Test auf Nothin g wird das getestet und in diesem Fall eine entsprechend angepasste Fehlermeldung ausgegeben. Ansonsten läuft alles nach Plan und jetzt kommt der Clou der ganzen Sache: Set objol = objconnect.olapplication Hier wird die bisher auf das Outlook.Application-Objekt stehende Variable objol auf die wichtige Eigenschaft OLApplication des gesetzt. Die enthält zwar genau dasselbe Outlook.Application -Objekt, doch erscheint der Sicherheitsdialog anschließend nicht, weil dieses Application-Objekt nun "von außen" und nicht direkt angesprochen wird. Der weitere Code führt dann, genau wie im ersten Beispiel oben, die eigentlichen Aufgaben durch. Neu in V.1.1 Der Einsatz des führt natürlich zu einem gewissen Sicherheitsrisiko: Jede Anwendung kann nun nach beschriebenen Verfahren mit seiner Hilfe Outlook automatisieren, ohne dass die Sicherheitsabfrage erscheint. Damit ist das Versenden von Massenmails und Zugriff auf die Kontakte im Stillen möglich. Aus diesem Grund wurde die Möglichkeit implementiert, das Outlook-Application-Objekt erst nach Angabe eines Passworts zu erhalten. objconnect.password = "Sascha Trowitzsch" Set objol = objconnect.olapplication 3 / 5
Ist der Passwort-Modus des eingeschaltet, dann würde im vorstehenden Code die Objektvariable objol ungültig sein (Nothing), falls das übergebene Passwort inkorrekt ist oder die entsprechende Zeile weggelassen würde. Somit ist es nur einer Anwendung, die dieses Passwort kennt, möglich, auf Outlook mit dem zuzugreifen. Das Passwort kann in V.1.1 in den Optionen von Outlook eingegeben werden. Ist der geladen, dann sieht der Optionen-Dialog (Menü Extras Optionen...) so aus: Es gibt hier eine neue Registerseite "". Im entsprechenden Feld kann darin das Passwort eingegeben werden und mit "Übernehmen" oder "OK" gespeichert werden. Die Passwortabfrage tritt dabei nur in Kraft, wenn auch das Häkchen auf " Use Password " gesetzt wurde. Ist das Häkchen deaktiviert, dann ist die Codezeile mit der Passwortübergabe irrelevant. Das Passwort wird übrigens RC4-verschlüsselt in der Registry unter dem Zweig HKEY_CURRENT_USER abgelegt und gilt damit nur für den aktuellen Benutzer des Computers. Sollen also mehrere User den 4 / 5
im Passwort-Modus verwenden können, so muss für jeden einzelnen das Passwort in Outlook eingegeben werden. Dies wurde aus Sicherheitsgründen explizit so implementiert. Zum Schluss nochmals der ausdrückliche Hinweis, dass es aus technischen Gründen nicht möglich ist, den auch unter Outlook XP (2002) einzusetzen! 5 / 5