{"id":55000340,"date":"2022-12-01T00:00:00","date_gmt":"2023-03-02T16:58:51","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=340"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Outlook_Ordner_per_VBA_im_Griff","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Outlook_Ordner_per_VBA_im_Griff\/","title":{"rendered":"Outlook: Ordner per VBA im Griff"},"content":{"rendered":"<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_340_001.png\" alt=\"Outlook-Ordner f&uuml;r E-Mails\" width=\"700\" height=\"431,8693\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Outlook-Ordner f&uuml;r E-Mails<\/span><\/b><\/p>\n<p><b>Bei einer frischen Outlook-Installation ist die Ordner-Hierarchie recht &uuml;bersichtlich. Je mehr E-Mails man mit Outlook erh&auml;lt oder je mehr man mit den &uuml;brigen Objekten arbeitet, umso mehr Ordner legt man in den bereits vorhandenen Ordnern als Unterordner an. F&uuml;r uns ist nat&uuml;rlich vor allem interessant, wie wir per VBA auf die einzelnen Ordner zugreifen, Ordner ermitteln, anlegen, bearbeiten oder auch l&ouml;schen. Interessant ist auch, gezielt nach einem Ordner zu suchen und diesen zu referenzieren. Gegebenenfalls m&ouml;chten wir auch einmal alle vorhandenen Ordner durchlaufen, um die enthaltenen Elemente zu verarbeiten. Wie all dies funktioniert, zeigen wir im vorliegenden Artikel!<\/b><\/p>\n<p>Wer eine neue Outlook-Installation &ouml;ffnet und ein erstes E-Mail-Konto angelegt hat, findet erst einmal nur die Standardordner im linken Bereich des Outlook-Fensters vor. Dazu geh&ouml;ren der Posteingang, der Postausgang, Ordner f&uuml;r gel&ouml;schte Elemente, Entw&uuml;rfe, gesendete Elemente und f&uuml;r Junk-E-Mail (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_340_001.png\" alt=\"Outlook-Ordner f&uuml;r E-Mails\" width=\"700\" height=\"431,8693\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Outlook-Ordner f&uuml;r E-Mails<\/span><\/b><\/p>\n<p>Wechseln wir &uuml;ber die Schaltfl&auml;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&uuml;r die jeweilige Kategorie vor. Wer immer alle Ordner aus den verschiedenen Bereichen im &Uuml;berblick sehen m&ouml;chte, kann &uuml;ber die Schaltfl&auml;che mit den drei Punkten weitere Befehle anzeigen (sofern diese noch nicht sichtbar sind) und &uuml;ber den Befehl <b>Ordner <\/b>eine &Uuml;bersicht aller Ordner einblenden. Diese liefert schlie&szlig;lich alle Ordner der verschiedenen Kategorien in einer Liste (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_340_002.png\" alt=\"Alle Outlook-Ordner im &Uuml;berblick\" width=\"424,6267\" height=\"643,278\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Alle Outlook-Ordner im &Uuml;berblick<\/span><\/b><\/p>\n<h2>Zugriff von innen und au&szlig;en<\/h2>\n<p>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.<\/p>\n<p>Wir greifen also nicht einfach &uuml;ber die Klasse Application auf die davon bereitgestellten Objekte, Eigenschaften, Methoden und Ereignisse zu, sondern &uuml;ber eine Objektvariable namens <b>objOutlook<\/b>, die wir zuvor deklarieren und f&uuml;llen.<\/p>\n<p>Au&szlig;erdem wollen wir per Early Binding auf die Klassen zugreifen, damit wir IntelliSense beim Programmieren nutzen k&ouml;nnen. Wenn Du nicht vom VBA-Projekt von Outlook aus auf die Outlook-Objekte zugreifen m&ouml;chtest, musst Du dazu noch einen Verweis auf die Objektbibliothek von Outlook hinzuf&uuml;gen.<\/p>\n<p>Dazu &ouml;ffnest Du den VBA-Editor von der jeweiligen Anwendung aus und w&auml;hlst dort den Men&uuml;befehl <b>Extras|Verweise <\/b>aus.<\/p>\n<p>Es erscheint der <b>Verweise<\/b>-Dialog, wo Du in der Liste den Eintrag <b>Microsoft Outlook 16.0 Object Library <\/b>ausw&auml;hlst (siehe Bild 3). Danach schlie&szlig;t Du den Dialog wieder.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_340_003.png\" alt=\"Hinzuf&uuml;gen eines Verweises auf die Outlook-Objektbibliothek\" width=\"499,6267\" height=\"393,8742\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Hinzuf&uuml;gen eines Verweises auf die Outlook-Objektbibliothek<\/span><\/b><\/p>\n<p>Auf die Outlook-Anwendung greifen wir dann mit den folgenden beiden Befehlen zu:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n<span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application<\/pre>\n<p>Auf diese Weise k&ouml;nnen wir auch beispielsweise vom VBA-Projekt einer Excel-Datei oder von anderen Anwendungen darauf zugreifen.<\/p>\n<h2>Mutter aller Ordner: Der MAPI-Namespace<\/h2>\n<p>Wenn wir direkt auf die Ordner von Outlook zugreifen wollen, k&ouml;nnen wir nicht direkt irgendeine <b>Folders<\/b>-Auflistung des <b>Application<\/b>-Objekts von Outlook nutzen, sondern es gibt noch eine Zwischenschicht. Diese ist das <b>Namespace<\/b>-Objekt, das wir allerdings nicht mit dem <b>New<\/b>-Schl&uuml;sselwort erzeugen, sondern mit der Methode <b>GetNamespace <\/b>holen.<\/p>\n<p>F&uuml;r diese &uuml;bergeben wir den Wert <b>MAPI <\/b>als Parameter. Das Namespace-Objekt deklarieren wir beispielsweise als <b>objMAPI <\/b>oder <b>objNamespace <\/b>und weisen es dann wie folgt zu:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objMAPI<span style=\"color:blue;\"> As <\/span>Outlook.NameSpace\r\n<span style=\"color:blue;\">Set<\/span> objMAPI = objOutlook.GetNamespace(\"MAPI\")<\/pre>\n<h2>Zugriff &uuml;ber die Folders-Auflistung<\/h2>\n<p>Die einfachste Methode, auf ein <b>Folder<\/b>-Element zuzugreifen ist die <b>Folders<\/b>-Auflistung des <b>NameSpace<\/b>-Objekts. Mit seiner <b>Count<\/b>-Eigenschaft k&ouml;nnen wir die Anzahl der <b>Folder<\/b>-Objekte ermitteln, allerdings nur f&uuml;r die der ersten Ebene.<\/p>\n<p>Was im Neuzustand einer Outlook-Datei noch nicht zu erkennen ist: Wir k&ouml;nnen den vorhandenen Ordnern durchaus Unterordner hinzuf&uuml;gen. Genaugenommen ist das auch schon der Fall, wie der erste Aufruf der <b>Count<\/b>-Eigenschaft der <b>Folders<\/b>-Auflistung zeigt:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> objMAPI.Folders.Count\r\n1<\/pre>\n<h2>Folder-Element referenzieren<\/h2>\n<p>Wir erhalten n&auml;mlich genau ein <b>Folder<\/b>-Element. Auf dieses wollen wir nun zugreifen und seinen Namen ermitteln. Dazu referenzieren wir es, was auf verschiedene Arten gelingt. Die erste ist die &uuml;ber den Index. Damit greifen wir wie folgt auf das Element zu:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> objMAPI.Folders(1).Name\r\nandre@minhorst.com<\/pre>\n<p>Als Ergebnis erhalten wir den Namen des Hauptordners, in diesem Fall nach der E-Mail-Adresse benannt, f&uuml;r die wir Outlook eingerichtet haben. Je nach Einrichtung kann dieser Ordner auch <b>Outlook <\/b>hei&szlig;en. Eine weitere wichtige Information hieraus ist: Der Index der <b>Folders<\/b>-Auflistung ist <b>1<\/b>-basiert.<\/p>\n<p>Die zweite M&ouml;glichkeit, ein <b>Folder<\/b>-Element &uuml;ber die <b>Folders<\/b>-Auflistung zu referenzieren, ist die Angabe des Namens, sofern dieser bekannt ist.<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> objMAPI.Folders(\"andre@minhorst.com\").Name<\/pre>\n<p>Was die Eigenschaften und Methoden der <b>Folder<\/b>-Klasse angeht, tappen wir hier etwas im Dunkeln, denn wenn wir ein Element &uuml;ber die Auflistung ansprechen, werden diese nicht per IntelliSense bereitgestellt. Dazu ben&ouml;tigen wir eine entsprechende Objektvariable.<\/p>\n<h2>Variable f&uuml;r Folder-Element<\/h2>\n<p>Deshalb referenzieren wir als N&auml;chstes ein <b>Folder<\/b>-Element mit einer Variablen. Diese deklarieren wir beispielsweise wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder<\/pre>\n<p>Dieser Variablen weisen wir nun das <b>Folder<\/b>-Element hinzu:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objFolder = objMAPI.Folders(1)<\/pre>\n<p>Danach k&ouml;nnen wir leicht per IntelliSense auf die einzelnen Eigenschaften des <b>Folder<\/b>-Elements zugreifen. Wie das gelingt, sehen wir in Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_340_004.png\" alt=\"Eigenschaften des Folder-Elements per IntelliSense nutzen\" width=\"524,6265\" height=\"412,4854\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Eigenschaften des Folder-Elements per IntelliSense nutzen<\/span><\/b><\/p>\n<h2>Folders-Auflistung durchlaufen<\/h2>\n<p>Wenn wir f&uuml;r das Root-Folder-Element die Anzahl der untergeordneten <b>Folder<\/b>-Elemente ermitteln, erhalten wir f&uuml;r unsere frisch installierte Outlook-Anwendung bereits einige Unterordner:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> objFolder.Folders.Count\r\n14<\/pre>\n<p>Damit k&ouml;nnen wir schon eher etwas anfangen und wollen diese nun per Schleife durchlaufen.<\/p>\n<p>Das gelingt sowohl in einer <b>For&#8230;Next<\/b>-Schleife als auch in einer <b>For Each<\/b>-Schleife.<\/p>\n<p>Mit der <b>For&#8230;Next<\/b>-Schleife durchlaufen wir die Elemente von <b>1 <\/b>bis zur Anzahl der Elemente:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\nFor i = 1 To objFolder.Folders.Count\r\n     <span style=\"color:blue;\">Debug.Print<\/span> i, objFolder.Folders(i).Name\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Das Ergebnis sieht wie folgt aus:<\/p>\n<pre>  1            Gel&ouml;schte Elemente\r\n  2            Posteingang\r\n  3            Postausgang\r\n  4            Gesendete Elemente\r\n  5            Kalender\r\n  6            Kontakte\r\n  7            Journal\r\n  8            Notizen\r\n  9            Aufgaben\r\n  10           Entw&uuml;rfe\r\n  11           RSS-Feeds\r\n  12           Einstellungen f&uuml;r Unterhaltungsaktionen\r\n  13           Einstellungen f&uuml;r QuickSteps\r\n  14           Junk-E-Mail<\/pre>\n<p>Mit einer <b>For Each<\/b>-Schleife durchlaufen wir die <b>Folder<\/b>-Elemente wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objSubfolder<span style=\"color:blue;\"> As <\/span>Folder\r\nFor Each objSubfolder In objFolder.Folders\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objSubfolder.Name\r\n<span style=\"color:blue;\">Next<\/span> objSubfolder<\/pre>\n<p>Das Ergebnis ist identisch &#8211; mit Ausnahme der fehlenden Werte der Laufvariablen.<\/p>\n<h2>Standardordner mit GetDefaultFolder referenzieren<\/h2>\n<p>Bevor wir uns die Eigenschaften der <b>Folder<\/b>-Klasse ansehen, wollen wir noch weitere M&ouml;glichkeiten zum Referenzieren von <b>Folder<\/b>-Elementen betrachten. Wenn wir die Eigenschaften und Methoden des MAPI-Namespaces per IntelliSense anzeigen, finden wir hier beispielsweise noch die Methode <b>GetDefaultFolder<\/b> (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_340_005.png\" alt=\"Weitere Methoden zum Referenzieren von Folder-Elementen\" width=\"424,6267\" height=\"316,0821\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Weitere Methoden zum Referenzieren von Folder-Elementen<\/span><\/b><\/p>\n<p>W&auml;hlen wir diese aus und tippen noch eine &ouml;ffnende Klammer ein, erhalten wir eine Auflistung der m&ouml;glichen Ordner. Diese lauten:<\/p>\n<ul>\n<li><b>olFolderCalendar<\/b>: Ordner f&uuml;r Termine<\/li>\n<li><b>olFolderContacts<\/b>: Ordner f&uuml;r Kontakte<\/li>\n<li><b>olFolderDeletedItems<\/b>: Ordner f&uuml;r gel&ouml;schte Elemente<\/li>\n<li><b>olFolderDrafts<\/b>: Ordner f&uuml;r Entw&uuml;rfe<\/li>\n<li><b>olFolderInbox<\/b>: Ordner f&uuml;r den Posteingang<\/li>\n<li><b>olFolderJournal<\/b>: Ordner f&uuml;r Journaleintr&auml;ge<\/li>\n<li><b>olFolder Junk<\/b>: Ordner f&uuml;r Junk-E-Mail<\/li>\n<li><b>olFolderNotes<\/b>: Ordner f&uuml;r Notizen<\/li>\n<li><b>olFolderOutbox<\/b>: Ordner f&uuml;r den Postausgang<\/li>\n<li><b>olFolderRssFeeds<\/b>: Ordner f&uuml;r RSS<\/li>\n<li><b>olFolderSentMails<\/b>: Ordner f&uuml;r gesendete Objekte<\/li>\n<li><b>olFolderTasks<\/b>: Ordner f&uuml;r Aufgaben<\/li>\n<\/ul>\n<p>Wenn wir also einen dieser Ordner referenzieren wollen, k&ouml;nnen wir das direkt &uuml;ber die Methode <b>GetDefaultFolder <\/b>erledigen.<\/p>\n<p>Um beispielsweise den Ordner mit dem Parameter <b>olFolderInbox <\/b>zu referenzieren, verwenden wir die folgenden Anweisungen. Die letzte gibt den Anzeigenamen dieses Ordners im Direktbereich des VBA-Editors aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objInbox<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n<span style=\"color:blue;\">Set<\/span> objInbox = objMAPI.GetDefaultFolder(olFolderInbox)\r\n<span style=\"color:blue;\">Debug.Print<\/span> objInbox.Name<\/pre>\n<p>Auf die gleiche Art lassen sich auch die &uuml;brigen Ordner referenzieren.<\/p>\n<h2>Ordner per ID referenzieren<\/h2>\n<p>Eine weitere M&ouml;glichkeit zum Referenzieren eines Ordners ist die Verwendung der Methode <b>GetFolderFromID<\/b>, dem man die eindeutige ID des Ordners &uuml;bergeben muss. Diese kennen wir &uuml;blicherweise nicht, sodass wir diese zuerst ermitteln m&uuml;ssten.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000340\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000340?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000340\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"e5ea4c0d5c\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei einer frischen Outlook-Installation ist die Ordner-Hierarchie recht &uuml;bersichtlich. Je mehr E-Mails man mit Outlook erh&auml;lt oder je mehr man mit den &uuml;brigen Objekten arbeitet, umso mehr Ordner legt man in den bereits vorhandenen Ordnern als Unterordnern an. F&uuml;r uns ist nat&uuml;rlich vor allem interessant, wie wir per VBA auf die einzelnen Ordner zugreifen, Ordner ermitteln, anlegen, bearbeiten oder auch l&ouml;schen. Interessant ist auch, gezielt nach einem Ordner zu suchen und diesen zu referenzieren. Gegebenenfalls m&ouml;chten wir auch einmal alle vorhandenen Ordner durchlaufen, um die enthaltenen Elemente zu verarbeiten. Wie all dies funktioniert, zeigen wir im vorliegenden Artikel!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662022,66062022,44000004,44000026],"tags":[],"yst_prominent_words":[],"class_list":["post-55000340","post","type-post","status-publish","format-standard","hentry","category-662022","category-66062022","category-Loesungen","category-Outlook_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000340","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000340"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000340\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000340"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000340"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000340"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}