Nicht alle eingehenden E-Mails, die man erhält, müssen beantwortet werden. Beispiele sind Bestellbestätigungen, Rechnungen et cetera. Diese wollen Sie aber vielleicht aus dem Posteingangs-Ordner in einen anderen Ordner verschieben, der beispielsweise nur E-Mails enthält, die mit Bestellungen zu tun haben. Das gelingt per Drag and Drop relativ schnell. Noch besser wäre aber eine Tastenkombination, mit der wir die Mails in die Zielordner verschieben könnten. Dann brauchen Sie beim Durchgehen des Posteingangs die Hände gar nicht mehr von der Tastatur zu nehmen. Die hier vorgestellte Lösung berührt zwar nicht die Datenbankanwendung Microsoft Access, um die es eigentlich in diesem Magazin geht, aber diese Lösung für effizienteres Arbeiten wollen wir Ihnen nicht vorenthalten.
Es gibt sicher Menschen, für die es in Bezug auf die E-Mails im Posteingang von Outlook nur zwei Möglichkeiten gibt: Beantworten und löschen oder direkt löschen. Die meisten müssen aber vielleicht geschäftliche und andere E-Mails aufbewahren oder machen das einfach aus praktischen Gründen. Zum Beispiel ist es sinnvoll, alle E-Mails, die mit Onlinebestellungen zusammenhängen, aufzubewahren.
Dazu bietet es sich unter Outlook an, weitere Ordner unterhalb des Ordners Posteingang anzulegen und diesen Bezeichnungen wie beispielsweise Bestellungen zu geben (siehe Bild 1). E-Mails, die sich im Posteingang befinden und die mit Bestellungen in Zusammenhang stehen, können Sie dann mit der Maus per Drag and Drop in diesen Ordner verschieben.
Bild 1: Bestellungen-Ordner in Outlook
Wenn Sie jedoch viele solcher E-Mails bekommen, die Sie schnell einem bestimmten Ordner unterhalb des Posteingang-Ordners zuweisen wollen, wird das ewige Drag and Drop schnell anstrengend.
E-Mails verschieben per Tastenkombination
Also haben wir uns überlegt, wie wir solche Arbeitsschritte vereinfachen können. Die naheliegendste Idee ist der Einsatz einer Tastenkombination, mit der wir eine von uns für diesen Zweck angelegte VBA-Prozedur aufrufen wollen. Die Idee mit der VBA-Prozedur können wir umsetzen, aber es gibt keine direkte Möglichkeit in Outlook, eine solche per Tastenkombination aufzurufen. Daher müssen wir einen kleinen Umweg gehen: Wir können VBA-Prozeduren nämlich mit benutzerdefinierten Schaltflächen im Ribbon aufrufen, und dieses kann mit einigen Einschränkungen per Tastenkombination gesteuert werden.
Wir werden in den nächsten Abschnitten zunächst die benötigten VBA-Prozeduren erstellen und dann die Ribbon-Einträge samt Tastenkombinationen hinzufügen.
Modul im VBA-Projekt von Outlook anlegen
Im Gegensatz zu Access, wo jede Datenbankdatei ein eigenes VBA-Projekt aufweist, gibt es für Outlook ein zentrales VBA-Projekt. Schließlich gibt es in Outlook keine zu öffnenden Dateien beziehungsweise Dokumente wie in den anderen Office-Anwendungen.
Den VBA-Editor mit diesem VBA-Projekt zeigen Sie von Outlook aus mit der Tastenkombination Alt + F11 an. Hier finden Sie standardmäßig nur den Ordner Microsoft Outlook Objekte mit der Klasse ThisOutlookSession. Um Prozeduren anzulegen, fügen wir über den Menüeintrag Einfügen|Modul ein neues Standardmodul hinzu und nennen dieses mdlMailsAndFolders. Dieses Modul wir dann im Ordner Module angezeigt.
E-Mail per VBA verschieben
Die geplante VBA-Prozedur soll alle zum Zeitpunkt des Aufrufs markierten Einträge des Posteingangs in den mit strFolder angegebenen Zielordner verschieben (siehe Listing 1).
Public Sub MoveToFolder(strTargetfolder As String) Dim objMailItem As MailItem Dim objExplorer As Explorer Dim objSelection As Selection Dim objTargetFolder As Folder Dim objCurrentFolder As Folder Dim objNamespace As NameSpace Dim i As Integer Set objExplorer = Application.ActiveExplorer Set objCurrentFolder = objExplorer.CurrentFolder If objCurrentFolder.Name = "Posteingang" Then Set objSelection = objExplorer.Selection Set objNamespace = Application.GetNamespace("MAPI") Set objTargetFolder = GetFolder(objNamespace, strTargetfolder) For i = 1 To objSelection.count Select Case TypeName(objSelection.Item(i)) Case "MailItem" Set objMailItem = objSelection.Item(i) objMailItem.Move objTargetFolder End Select Next i End If End Sub
Listing 1: Verschieben der aktuell markierten E-Mails in den mit strFolder angegebenen Ordner
Dazu deklarieren wir verschiedene Variablen, die wir anschließend füllen. Als Erstes referenzieren wir mit der Variablen objExplorer das mit ActiveExplorer ermittelte Fenster zur Ansicht von Ordnerinhalten unter Outlook.
Dann weisen wir den Standardordner des Explorer-Objekts der Variablen objCurrentFolder zu und prüfen, ob der Name des Ordners Posteingang lautet. Wenn Sie eine englische Version von Office nutzen, müssen Sie diese Zeile gegebenenfalls noch anpassen. Hat der Ordner den Namen Posteingang, arbeitet die Prozedur die Anweisungen in der If…Then-Bedingung ab.
Hier referenzieren wir die ausgewählten Elemente mit der Variablen objSelection und den aktuellen MAPI-Namespace mit objNamespace. Leider kann man nicht direkt über den Namen auf Folder-Objekte zugreifen, die nicht in der ersten Ebene liegen (also unterhalb von Posteingang).
Deshalb benötigen wir eine Hilfsfunktion namens GetFolder, um den mit strTargetfolder angegebenen Ordner zu erhalten. Dieser Funktion, die wir weiter unten beschreiben, übergeben wir die Variablen objNamespace und strTargetfolder und erhalten ein Folder-Objekt mit dem Zielordner zurück.
Danach durchläuft die Prozedur in einer For…Next-Schleife über die Zahlen von 1 bis zur Anzahl der markierten Elemente alle betroffenen Einträge. Nach einer Prüfung, ob es sich bei dem jeweiligen Eintrag um eines mit dem Typ MailItem handelt, weisen wir dieses der Variablen objMailItem zu. Für dieses rufen wir dann die Methode Move auf und geben mit objTargetfolder den Zielordner für das Verschieben an.
Die Funktion GetFolder
Die Funktion aus Listing 2 erwartet die Angabe des zu verwendenden Namespace-Objekts sowie des Pfades zum zu ermittelten Ordner als Parameter.
Public Function GetFolder(objNamespace As NameSpace, strSubfolder As String) As Folder Dim objFolder As Folder Dim strFolders() As String Dim i As Integer If Left(strSubfolder, 2) = "" Then strSubfolder = Mid(strSubfolder, 3) End If strFolders = Split(strSubfolder, "\") Set objFolder = objNamespace.Folders(strFolders(0)) If UBound(strFolders) - LBound(strFolders) > 0 Then For i = LBound(strFolders) + 1 To UBound(strFolders) Set objFolder = objFolder.Folders(strFolders(i)) Next i End If Set GetFolder = objFolder End Function
Listing 2: Ermitteln eines Folder-Objekts anhand des Pfades
Dieser Pfad lautet beispielsweise für den Ordner Posteingang wie folgt:
Outlook\Posteingang
Wenn Sie einen Ordner namens Bestellungen verwenden wollen, der sich direkt im Ordner Posteingang befindet, lautet der Pfad:
Outlook\Posteingang\Bestellungen
Nachfolgend wollen wir die einzelnen Elemente des Pfades in ein Array übertragen und dabei die Split-Funktion nutzen, um den Pfad an den Backslash-Zeichen aufzuspalten. Dazu müssen wir zunächst die eventuell vorn angegebenen beiden Backslash-Zeichen entfernen. Ob diese Zeichen angegeben wurden, prüfen wir mit einer ersten If…Then-Bedingung und entfernen diese gegebenenfalls.
Um beim obigen Beispiel zu bleiben, erhalten wir nun die folgende Zeichenkette:
Outlook\Posteingang\Bestellungen
Mit der Split-Anweisung fügen wir nun die durch das Backslash-Zeiten getrennten Teilzeichenketten in die Elemente eines Arrays namens strFolders.