none
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
    Dienstag, 3. Oktober 2017 14:25

Antworten

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
    Dienstag, 3. Oktober 2017 14:59
  • Danke! Der erste Teil ist damit erledigt. Den Beispielcode habe ich aus einem anderen Forum, da war das "depth" drin.
    Dienstag, 3. Oktober 2017 15:12
  • 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

    Dienstag, 3. Oktober 2017 16:15
  • 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.
    Mittwoch, 4. Oktober 2017 07:48
  • 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
    Mittwoch, 4. Oktober 2017 08:42
  • 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.

    Mittwoch, 4. Oktober 2017 10:49
  • (...) allerdings kann man den Namen auch per Split(Name, "=>") in ein Array aufteilen (...)

    So mache ich das schon. Aber eben nur für 3 Ordnerebenen. Mit Schleifen habe ich nichts am Hut. :zwinker:

    Mittwoch, 4. Oktober 2017 11:41
  • Ich meine da auch nicht die rosaroten;-).
    Aber Rekursion bietet sich bei unbekannten Tiefen durchaus an, ist einfach und übersichtlich.

    Mittwoch, 4. Oktober 2017 13:30
  • 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.

    Sonntag, 8. Oktober 2017 20:30