Outlook: Ordner per VBA im Griff

Outlook-Ordner für E-Mails

Bild 1: Outlook-Ordner für E-Mails

Bei einer frischen Outlook-Installation ist die Ordner-Hierarchie recht übersichtlich. Je mehr E-Mails man mit Outlook erhält oder je mehr man mit den übrigen Objekten arbeitet, umso mehr Ordner legt man in den bereits vorhandenen Ordnern als Unterordner an. Für uns ist natürlich vor allem interessant, wie wir per VBA auf die einzelnen Ordner zugreifen, Ordner ermitteln, anlegen, bearbeiten oder auch löschen. Interessant ist auch, gezielt nach einem Ordner zu suchen und diesen zu referenzieren. Gegebenenfalls möchten wir auch einmal alle vorhandenen Ordner durchlaufen, um die enthaltenen Elemente zu verarbeiten. Wie all dies funktioniert, zeigen wir im vorliegenden Artikel!

Wer eine neue Outlook-Installation öffnet und ein erstes E-Mail-Konto angelegt hat, findet erst einmal nur die Standardordner im linken Bereich des Outlook-Fensters vor. Dazu gehören der Posteingang, der Postausgang, Ordner für gelöschte Elemente, Entwürfe, gesendete Elemente und für Junk-E-Mail (siehe Bild 1).

Outlook-Ordner für E-Mails

Bild 1: Outlook-Ordner für E-Mails

Wechseln wir über die Schaltflächen unten links zu einem der anderen Bereiche wie beispielsweise dem Kalender, den Kontakten oder den Aufgaben, finden wir im linken Bereich wiederum verschiedene Ordner für die jeweilige Kategorie vor. Wer immer alle Ordner aus den verschiedenen Bereichen im Überblick sehen möchte, kann über die Schaltfläche mit den drei Punkten weitere Befehle anzeigen (sofern diese noch nicht sichtbar sind) und über den Befehl Ordner eine Übersicht aller Ordner einblenden. Diese liefert schließlich alle Ordner der verschiedenen Kategorien in einer Liste (siehe Bild 2).

Alle Outlook-Ordner im Überblick

Bild 2: Alle Outlook-Ordner im Überblick

Zugriff von innen und außen

Die Beispiele zu diesem Artikel haben wir so programmiert, dass Du sie sowohl direkt in den Modulen des VBA-Projekts von Outlook verwenden kannst, aber auch in anderen Anwendungen wie Access, Excel oder Word.

Wir greifen also nicht einfach über die Klasse Application auf die davon bereitgestellten Objekte, Eigenschaften, Methoden und Ereignisse zu, sondern über eine Objektvariable namens objOutlook, die wir zuvor deklarieren und füllen.

Außerdem wollen wir per Early Binding auf die Klassen zugreifen, damit wir IntelliSense beim Programmieren nutzen können. Wenn Du nicht vom VBA-Projekt von Outlook aus auf die Outlook-Objekte zugreifen möchtest, musst Du dazu noch einen Verweis auf die Objektbibliothek von Outlook hinzufügen.

Dazu öffnest Du den VBA-Editor von der jeweiligen Anwendung aus und wählst dort den Menübefehl Extras|Verweise aus.

Es erscheint der Verweise-Dialog, wo Du in der Liste den Eintrag Microsoft Outlook 16.0 Object Library auswählst (siehe Bild 3). Danach schließt Du den Dialog wieder.

Hinzufügen eines Verweises auf die Outlook-Objektbibliothek

Bild 3: Hinzufügen eines Verweises auf die Outlook-Objektbibliothek

Auf die Outlook-Anwendung greifen wir dann mit den folgenden beiden Befehlen zu:

Dim objOutlook As Outlook.Application
Set objOutlook = New Outlook.Application

Auf diese Weise können wir auch beispielsweise vom VBA-Projekt einer Excel-Datei oder von anderen Anwendungen darauf zugreifen.

Mutter aller Ordner: Der MAPI-Namespace

Wenn wir direkt auf die Ordner von Outlook zugreifen wollen, können wir nicht direkt irgendeine Folders-Auflistung des Application-Objekts von Outlook nutzen, sondern es gibt noch eine Zwischenschicht. Diese ist das Namespace-Objekt, das wir allerdings nicht mit dem New-Schlüsselwort erzeugen, sondern mit der Methode GetNamespace holen.

Für diese übergeben wir den Wert MAPI als Parameter. Das Namespace-Objekt deklarieren wir beispielsweise als objMAPI oder objNamespace und weisen es dann wie folgt zu:

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

Zugriff über die Folders-Auflistung

Die einfachste Methode, auf ein Folder-Element zuzugreifen ist die Folders-Auflistung des NameSpace-Objekts. Mit seiner Count-Eigenschaft können wir die Anzahl der Folder-Objekte ermitteln, allerdings nur für die der ersten Ebene.

Was im Neuzustand einer Outlook-Datei noch nicht zu erkennen ist: Wir können den vorhandenen Ordnern durchaus Unterordner hinzufügen. Genaugenommen ist das auch schon der Fall, wie der erste Aufruf der Count-Eigenschaft der Folders-Auflistung zeigt:

Debug.Print objMAPI.Folders.Count
1

Folder-Element referenzieren

Wir erhalten nämlich genau ein Folder-Element. Auf dieses wollen wir nun zugreifen und seinen Namen ermitteln. Dazu referenzieren wir es, was auf verschiedene Arten gelingt. Die erste ist die über den Index. Damit greifen wir wie folgt auf das Element zu:

Debug.Print objMAPI.Folders(1).Name
andre@minhorst.com

Als Ergebnis erhalten wir den Namen des Hauptordners, in diesem Fall nach der E-Mail-Adresse benannt, für die wir Outlook eingerichtet haben. Je nach Einrichtung kann dieser Ordner auch Outlook heißen. Eine weitere wichtige Information hieraus ist: Der Index der Folders-Auflistung ist 1-basiert.

Die zweite Möglichkeit, ein Folder-Element über die Folders-Auflistung zu referenzieren, ist die Angabe des Namens, sofern dieser bekannt ist.

Debug.Print objMAPI.Folders("andre@minhorst.com").Name

Was die Eigenschaften und Methoden der Folder-Klasse angeht, tappen wir hier etwas im Dunkeln, denn wenn wir ein Element über die Auflistung ansprechen, werden diese nicht per IntelliSense bereitgestellt. Dazu benötigen wir eine entsprechende Objektvariable.

Variable für Folder-Element

Deshalb referenzieren wir als Nächstes ein Folder-Element mit einer Variablen. Diese deklarieren wir beispielsweise wie folgt:

Dim objFolder As Outlook.Folder

Dieser Variablen weisen wir nun das Folder-Element hinzu:

Set objFolder = objMAPI.Folders(1)

Danach können wir leicht per IntelliSense auf die einzelnen Eigenschaften des Folder-Elements zugreifen. Wie das gelingt, sehen wir in Bild 4.

Eigenschaften des Folder-Elements per IntelliSense nutzen

Bild 4: Eigenschaften des Folder-Elements per IntelliSense nutzen

Folders-Auflistung durchlaufen

Wenn wir für das Root-Folder-Element die Anzahl der untergeordneten Folder-Elemente ermitteln, erhalten wir für unsere frisch installierte Outlook-Anwendung bereits einige Unterordner:

Debug.Print objFolder.Folders.Count
14

Damit können wir schon eher etwas anfangen und wollen diese nun per Schleife durchlaufen.

Das gelingt sowohl in einer For…Next-Schleife als auch in einer For Each-Schleife.

Mit der For…Next-Schleife durchlaufen wir die Elemente von 1 bis zur Anzahl der Elemente:

Dim i As Long
For i = 1 To objFolder.Folders.Count
     Debug.Print i, objFolder.Folders(i).Name
Next i

Das Ergebnis sieht wie folgt aus:

  1            Gelöschte Elemente
  2            Posteingang
  3            Postausgang
  4            Gesendete Elemente
  5            Kalender
  6            Kontakte
  7            Journal
  8            Notizen
  9            Aufgaben
  10           Entwürfe
  11           RSS-Feeds
  12           Einstellungen für Unterhaltungsaktionen
  13           Einstellungen für QuickSteps
  14           Junk-E-Mail

Mit einer For Each-Schleife durchlaufen wir die Folder-Elemente wie folgt:

Dim objSubfolder As Folder
For Each objSubfolder In objFolder.Folders
     Debug.Print objSubfolder.Name
Next objSubfolder

Das Ergebnis ist identisch – mit Ausnahme der fehlenden Werte der Laufvariablen.

Standardordner mit GetDefaultFolder referenzieren

Bevor wir uns die Eigenschaften der Folder-Klasse ansehen, wollen wir noch weitere Möglichkeiten zum Referenzieren von Folder-Elementen betrachten. Wenn wir die Eigenschaften und Methoden des MAPI-Namespaces per IntelliSense anzeigen, finden wir hier beispielsweise noch die Methode GetDefaultFolder (siehe Bild 5).

Weitere Methoden zum Referenzieren von Folder-Elementen

Bild 5: Weitere Methoden zum Referenzieren von Folder-Elementen

Wählen wir diese aus und tippen noch eine öffnende Klammer ein, erhalten wir eine Auflistung der möglichen Ordner. Diese lauten:

  • olFolderCalendar: Ordner für Termine
  • olFolderContacts: Ordner für Kontakte
  • olFolderDeletedItems: Ordner für gelöschte Elemente
  • olFolderDrafts: Ordner für Entwürfe
  • olFolderInbox: Ordner für den Posteingang
  • olFolderJournal: Ordner für Journaleinträge
  • olFolder Junk: Ordner für Junk-E-Mail
  • olFolderNotes: Ordner für Notizen
  • olFolderOutbox: Ordner für den Postausgang
  • olFolderRssFeeds: Ordner für RSS
  • olFolderSentMails: Ordner für gesendete Objekte
  • olFolderTasks: Ordner für Aufgaben

Wenn wir also einen dieser Ordner referenzieren wollen, können wir das direkt über die Methode GetDefaultFolder erledigen.

Um beispielsweise den Ordner mit dem Parameter olFolderInbox zu referenzieren, verwenden wir die folgenden Anweisungen. Die letzte gibt den Anzeigenamen dieses Ordners im Direktbereich des VBA-Editors aus:

Dim objInbox As Outlook.Folder
Set objInbox = objMAPI.GetDefaultFolder(olFolderInbox)
Debug.Print objInbox.Name

Auf die gleiche Art lassen sich auch die übrigen Ordner referenzieren.

Ordner per ID referenzieren

Eine weitere Möglichkeit zum Referenzieren eines Ordners ist die Verwendung der Methode GetFolderFromID, dem man die eindeutige ID des Ordners übergeben muss. Diese kennen wir üblicherweise nicht, sodass wir diese zuerst ermitteln müssten.

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar