Benutzer mit den meisten Antworten
Outlook - Ordner auflisten und ansprechen.

Frage
-
Hallo!
1. Ich möchte Ordner und Unterordner eines Kontos auflisten. Da aber die Anzahl der Unterordner unbekannt ist muss man per Schleife durchlaufen. Ein passender Code lautet wie folgt.
Sub x() ShowFolder Application.GetNamespace("MAPI").Session.Folders("Persönliche Ordner"), 1 End Sub Sub ShowFolder(f As MAPIFolder, depth As Integer) Dim fsub As MAPIFolder Debug.Print f.Name, depth For Each fsub In f.Folders ShowFolder fsub, depth + 1 Next End Sub
Allerdings benötige ich eine andere Darstellung. Den Ordnernamen sollen auch die Namen der übergeordneten Ordner (Parents) hinzugefügt werden, getrennt durch "=>", also z.B. "Posteingang=>Unterordner1=>Unterornder2". Da aber die Anzahl der Unterordner nicht bekannt ist kann man auch nicht mit "f.Parent.Name" arbeiten (bei zwei übergeordneten Ordner wäre es ja "f.Parent.Parent.Name"). Berücksichtigt werden soll zudem nur der Posteingang (was aber nicht das große Problem ist). Gibt es hierfür eine Lösung?
2. Ein weiteres Problem ist das spätere Ansprechen. Normalerweise spricht man Unterordner an mit Set olFolder = olName.Session.Folders("Kontoname").Folders("Posteingang").Folders("Unterordner1").Folders("Unterordner2"). Da man aber die Anzahl der Unterordner nicht kennt kann man nicht für alle erdenklichen Unterordner eine passende Codezeile schreiben. Gibt es dafür eine Lösung?
Danke!
Gruß, René
- Bearbeitet mumpel Dienstag, 3. Oktober 2017 14:28
Antworten
-
Moin,
es ist nicht ganz klar, wofür Du depth mitführst. Stattdessen solltest Du den bisherigen Pfad im richtigen Format übergeben:
Sub ShowFolder(f As MAPIFolder, strPath As String) Dim fsub As MAPIFolder Dim strSub As String Debug.Print strPath For Each fsub In f.Folders strSub = strPath & "==>" & fsub.Name ShowFolder fsub, strSub Next End Sub
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com- Als Antwort markiert mumpel Dienstag, 3. Oktober 2017 15:11
Alle Antworten
-
Moin,
es ist nicht ganz klar, wofür Du depth mitführst. Stattdessen solltest Du den bisherigen Pfad im richtigen Format übergeben:
Sub ShowFolder(f As MAPIFolder, strPath As String) Dim fsub As MAPIFolder Dim strSub As String Debug.Print strPath For Each fsub In f.Folders strSub = strPath & "==>" & fsub.Name ShowFolder fsub, strSub Next End Sub
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com- Als Antwort markiert mumpel Dienstag, 3. Oktober 2017 15:11
-
In Outlook funktioniert das schon mal. Nur weiss ich nicht wie ich das sauber in meinen Code einbaue. Wie könnte das aussehen?
Dieser Code berücksichtigt 3 Ordnerebenen.
Dim oGrp As sevOutBar4.GroupItem Set olApp = CreateObject("Outlook.Application") Set nspMapi = olApp.GetNamespace("MAPI") For Each Folder In nspMapi.Folders Set oGrp = OutBar1.AddGroup(Folder.Name, "Group" & lnGZaehler, , False) oGrp.ItemDisplayStyle = DisplayStyleMenu On Error Resume Next ' Hier steht noch Code (Tabellen einfügen und benennen) On Error GoTo 0 For Each subfolder1 In Folder.Folders Select Case subfolder1.Name Case "Posteingang" On Error Resume Next oGrp.AddItem subfolder1.Name, "nIndexPE" & lngZaehler2 For Each subfolder2 In subfolder1.Folders Select Case subfolder2.Name Case "Postausgang", "Gelöschte Elemente", "PrintMail", _ "Entwürfe", "Suchordner", "RSS-Feeds", "Junk-E-Mail", "Angriffe" Case Else oGrp.AddItem subfolder1.Name & "=>" & subfolder2.Name, "nIndexPU1" & lngZaehler3 For Each subfolder3 In subfolder2.Folders oGrp.AddItem subfolder1.Name & "=>" & subfolder2.Name & _ "=>" & subfolder3.Name, "nIndexPUU1" & lngZaehler4 lngZaehler4 = lngZaehler4 + 1 Next subfolder3 End Select lngZaehler3 = lngZaehler3 + 1 Next subfolder2 Case "Gesendete Elemente" oGrp.AddItem subfolder1.Name, "nIndexGE" & lngZaehler2 End Select lngZaehler2 = lngZaehler2 + 1 Next subfolder1 lnGZaehler = lnGZaehler + 1 Set oGrp = Nothing Next Folder
-
Am einfachsten ist hier in beiden Fällen eine Rekursionsfunktion (eine Funktion, die sich selber wieder aufruft), die den Parent immer dem Child voranstellt.
Dasselbe gilt dann auch wieder bei der Auflösung zum Objekt.
In einer Rekursion setzt man das Client-Objekt bis man die letzte Ebene erreicht hat. -
Für normale Fälle weiss ich wie man es macht. Aber für diesen speziellen Fall habe ich keine Ansätze (Schleifen gehören nicht zu meinem Spezialgebiet). Eine rekursive Funktion kann ich hier nicht nutzen.
- Bearbeitet mumpel Mittwoch, 4. Oktober 2017 08:43
-
Die ForEach-Schleife lässt sich in einer Funktion generalisieren und dann rekursiv aufrufen um alle Folder incl. Subfolder beliebiger Tiefe aufzunehmen.
Das Auflösen des zusammengesetzten Namens geht entweder auch wieder rekursiv, allerdings kann man den Namen auch per Split(Name, "=>") in ein Array aufteilen und per "for Index=lbound(Array) to ubound(Array) dann successive wieder abarbeiten.
Eine rekursive Funktion ist da wiederum einfacher.
Aber häufig haben die Objekte, die per Additem erstellt werden auch eine Tag-Eigenschaft, auf der ich den Objektverweis zum Folder direkt speichern kann.
-
Kleine Rückmeldung.
Das erste Problem habe ich durch einen Umweg gelöst. Ich habe einfach alle Variablen auf Userform-Ebene als öffentliche Variablen gesetzt. Dadurch kann auch "ShowFolder" auf das Gruppen-Objekt ("oGrp") zugreifen und sauber füllen. Aber vielleicht hat ja noch jemand eine elegantere Lösung.
Das zweite Problem konnte mt Hilfe eines anderen Forums gelöst werden.