VBA - OLK-Unterordner über Pfad ansprechen

Moderator: ModerationP

VBA - OLK-Unterordner über Pfad ansprechen

Beitragvon Proma » 01. Aug 2021, 12:18

Hallo liebe Experten,

im Internet habe ich einen VBA-Code gefunden, der es mir ermöglicht, die Standard-Ordner wie auch die Persönlichen Ordner samt des jeweils kompletten Pfades rekursiv aufzulisten. Als Ergebnis erhalte ich dann z.B. "\\Archiv_2020\Eingang".

Nun möchte ich diesen Ordner "Eingang" im Archiv 2020 einer VBA-Variablen zuweisen und ihn auslesen / durchsuchen / bearbeiten. Dazu habe ich mir diesen Code gebastelt, der auch soweit funktioniert.
Code: Alles auswählen
Public Sub pTest_OLK_Folder_aus_Pfad_ansprechen()
  Const s      As String = "\\Archiv_2020\Eingang"              'Pfadname Persönl. Ordner
'  const s      as String = "\\Mail.Adresse@Ich.de\Posteingang" 'Pfadname Standard-Ordner (funktioniert auch)
  Const strTrn As String = "\"                                  'Trennzeichen
 
  Dim strArr() As String                                        'Array für den Pfadnamen in der jeweiligen Ebene
  Dim i        As Integer                                       'Index-Variable
  Dim strPfd   As String                                        'Hilfsvariable zur Bearbeitung des Pfadnamens
  Dim olkFld   As Outlook.Folder                                'Objekt-Variable für einen Outlook-Folder
 
 
'Backslash am Beginn des Pfades entfernen
  strPfd = s
  While Left(strPfd, 1) = strTrn                                'Solange erstes Zeichen des Pfades ein Backslash ist
    strPfd = Mid(strPfd, 2)                                     '  Entferne das erste Zeichen des Pfades
  Wend                                                          'Ende Schleife
 
 
'Objekt-Variable für Outlook-Folder initialisieren
  With Application.GetNamespace("MAPI")                         'Bezugsobjekt: Das NameSpace-Objekt
    strArr = Split(strPfd, "\")                                 '  Schreibe die einzelnen Pfad-Komponenten in ein Array
    Set olkFld = .Session.Folders(strArr(0))                    '  Initialisiere die Ordner-Variable (erste Ebene)
    For i = 1 To UBound(strArr)                                 '  Schleife durch alle weiteren Ebenen
      Set olkFld = olkFld.Folders(strArr(i))                    '    Initialisiere die Ordner-Variable (weitere Ebenen)
    Next i                                                      '  Ende Schleife
  End With                                                      'Ende Bezugsobjekt (Das NameSpace-Objekt)
  MsgBox olkFld.Items.Count                                     'Zeige die Anzahl der im Ordner enthaltenen Mail-Items
 
 
'Auffräumen
  Set olkFld = Nothing                                          'Setze die Objekt-Variable zurück
End Sub

Ich würde jedoch - wenn es denn so etwas gibt - eine weniger aufwändige Lösung bevorzugen, etwa in der Art
Code: Alles auswählen
  With Application.GetNamespace("MAPI")                         'Bezugsobjekt: Das NameSpace-Objekt
    Set olkFld = .Session.Folders("Archiiv_2020\Eingang")       '  So geht's leider nicht
  End With                                                      'Ende Bezugsobjekt (Das NameSpace-Objekt)

Das hat natürlich nicht geklappt, wäre ja auch zu einfach gewesen. Vielleicht habt Ihr dazu noch eine Idee? Mir wäre auch schon geholfen, wenn Ihr mir klar sagt, dass dieser Weg...
Code: Alles auswählen
  With Application.GetNamespace("MAPI")
    Set olkFld = .Session.Folders("Archiiv_2020").Folders("Eingang").Folders(… usw.
  End With
... der einzig gangbare ist.

Meine Ausstattung:
Windows 10, Outlook 2010

Vielen Dank schon vorab und liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - OLK-Unterordner über Pfad ansprechen

Beitragvon Flotter Feger » 01. Aug 2021, 12:43

Hallo Martin,

im Prinzip geht es so, wie du es schon hast ... in einer Schleife werden die SubFolder abgefragt ... nur ohne Array.

http://www.office-loesung.de/ftopic523071_0_0_asc.php

Sabina
Benutzeravatar
Flotter Feger
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3327
Registriert: 24. Okt 2016, 16:40

Re: VBA - OLK-Unterordner über Pfad ansprechen

Beitragvon Fennek » 01. Aug 2021, 15:52

Hallo Martin,

im gezeigten Code kann keine Schleife über alle Unterordner erkennen.

Hier ein Code für den rekursiven Aufruf (Teile gelöscht). In einem eher einfachen Outlook lief er gut, in einem sehr komplexen nicht mehr:

Code: Alles auswählen
Sub alle_MAPI_Folder()
         
         'leere Ordner werden übersprungen (Yammer-Stamm)

Dim NSp As NameSpace: Set NSp = Application.GetNamespace("MAPI")
Dim FLD As Folder

For Each FLD In NSp.Folders
    'Debug.Print FLD.Name
    Call Rekursiver_Aufruf(FLD)
Next FLD

Beep
End Sub

Sub Rekursiver_Aufruf(Flds As Folder)

Dim FLD As Folder

For Each FLD In Flds.Folders
    If FLD.DefaultItemType = olMailItem And FLD.Items.Count > 5 Then
        Debug.Print FLD.Name
        Call Rekursiver_Aufruf(FLD)
    End If
Next FLD
End Sub


Die Vorlage war ein Code mit FSO für Ordner im FileSystem.

Warum sprichtst Du einen bekannten Ordner nicht so an:

Code: Alles auswählen
dim IBx as Folder
Set NSp = Application.GetNamespace("MAPI")
Set ibx = NSp.Folders("meine@Email.de").Folders("Erste Ebene").Folders("Zweite Ebene")


mfg
Benutzeravatar
Fennek
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 830
Registriert: 12. Feb 2016, 18:56

Re: VBA - OLK-Unterordner über Pfad ansprechen

Beitragvon Proma » 01. Aug 2021, 16:03

Hallo Sabina,

Danke für Deine Nachricht!

Selbst negative Antworten fühlen sich positiv an, wenn sie von Dir kommen! :P
Aber ich sagte ja schon, die Gewissheit zu haben, keinen überflüssigen Aufwand zu betreiben, das alleine stimmt mich schon froh. Und das Verwenden eines Array() für die Suche nach dem Unterordner vom Unterordner von Unterordner usw. werde ich mir einfach abgewöhnen.

Du hast mir wieder Sonne in diesen verregneten ersten August-Sonntag gebracht und dafür danke ich Dir recht herzlich! Und weil das Geben und Nehmen in diesem Forum naturgemäß immer recht einseitig verläuft und ich immer nur auf der Nehmer-Seite agiere, möchte ich Dir heute mit einem virtuellen
o000o Blumenstrauß ┌───────┐
\|||/. (s. links ) und ├═══&═══┤
. \|/.. einer (rechts ) └───────┘
digitalen Schachtel edelster Pralinen für Deine immer wieder so erfrischende Tätigkeit auf der Geberseite recht herzlich danken!

Guten Einstieg in den Bayerischen Ferienmonat August und liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - OLK-Unterordner über Pfad ansprechen

Beitragvon Proma » 01. Aug 2021, 17:22

Hallo Fennek,

danke für Deine Nachricht und das Muster für die rekursive Ordnersuche!
Fennek hat geschrieben:im gezeigten Code kann keine Schleife über alle Unterordner erkennen.

Das war auch nicht mein Problem. Die Grundlage für meinen Suchlauf zur Auflistung der Folders und der Subfolders habe ich hier gefunden https://de.extendoffice.com/documents/outlook/2089-outlook-get-list-of-folders.html#a1 und für meine Zwecke dann so aufbereitet:
Code: Alles auswählen
Public Function GetFoldersList() As String
   
    On Error GoTo On_Error
     
    Dim Report As String
    Dim Folder As Outlook.Folder
       
    For Each Folder In Application.Session.Folders
        Report = Report & "$;"
        Call RecurseFolders(Folder, "", Report)
    Next
     
Exiting:
    GetFoldersList = Mid(Report, 2)
    Exit Function
   
On_Error:
    MsgBox "error=" & Err.Number & " " & Err.Description
End Function



Sub RecurseFolders(CurrentFolder As Outlook.Folder, TabChars, ByRef Report As String)

    Dim SubFolder As Outlook.Folder
    Dim FolderName, StoreName As String

     
    FolderName = CurrentFolder.FolderPath
    StoreName = CurrentFolder.Store.DisplayName
     
    Report = Report & FolderName & ";"
     
    For Each SubFolder In CurrentFolder.Folders
        Call RecurseFolders(SubFolder, "", Report)
    Next SubFolder
End Sub

Damit erhalte ich eine String, der etwa so aussieht:
"\\Meine.MailAdresse@Ich.de;\\Meine.MailAdresse@Ich.de\Posteingang;\\Meine.MailAdresse@Ich.de\Gesendete Elemente... usw."

Diese Zeichenkette benötige ich, um jeden Ordner mit seinem kompletten Pfad in einem Menü (InputBox) aufzulisten und so dem Benutzer die Möglichkeit zu geben, den gewünschten Ordner auszuwählen. Damit alle Ordner und Unterordner in der Auflistung Platz finden, kürze ich in der Auflistung den Pfad etwas ab; das Ganze sieht dann ungefähr so aus
1 - \\Meine...\Posteingang
2 - \\Meine...\Gesendete Objekte
usw.
Die Kürzungen betreffen selbstverständlich nur die DARSTELLUNG der Pfade. Nach Eingabe der zugehörigen Kennzahl und Bestätigung mit OK wird dann der gewählte Ordnername samt vollständigem Pfad zurückgegeben. Und hier beginnt nun mein "Problem": Wie kann ich auf dem einfachsten Weg den gewünschten Ordner einer Objekt-Variablen zuweisen? Und damit bin ich schon bei Deiner zweiten Frage.

Dein Vorschlag funktioniert nur dann, wenn sich die gewählten Ordner immer in der selben Ebene befinden. Ich bemühe mich, keine Ordner in der dritten Ebene anzulegen. Weil das aber nicht jeder so handhabt, muss ich sehen, wie ich die Ordnerauswahl flexibel gestalten kann. So habe ich mich für dieses - zugegeben etwas umständliche - Verfahren entschieden. Eine Verbesserung (dank Sabinas Tipp mit dem überflüssigen Array) werde ich noch einbauen.

Was meintest Du mit dem "komplexen" bzw. "weniger komplexen" Outlook? Beziehst Du das auf den Umfang des Datenbestandes, und falls JA, ab welcher Datenmenge wird es kritisch?

Vielen Dank für Deine Unterstützung und liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - OLK-Unterordner über Pfad ansprechen

Beitragvon DerHoepp » 04. Aug 2021, 10:24

Moinsen,

ich würde den Adressstring in seine Bestandteile zerlegen und anschließend die Folder-Objekte in einer Schleife über das Array ermitteln:
Code: Alles auswählen
Sub testen()
    Debug.Print getFolder("\\meine@Adresse.de\Posteingang\Archiv\Rechnungen").FolderPath
   
   
End Sub

Function getFolder(PathToFolder As String) As Outlook.Folder
    Dim steps As Variant
    Dim i As Long
   
    steps = Split(Replace(PathToFolder, "\\", ""), "\")
    Set getFolder = ThisOutlookSession.Session.Folders(steps(LBound(steps)))
    For i = LBound(steps) + 1 To UBound(steps)
        Set getFolder = getFolder.Folders(steps(i))
    Next i
End Function


Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 9844
Registriert: 14. Mai 2013, 11:08

Re: VBA - OLK-Unterordner über Pfad ansprechen

Beitragvon Flotter Feger » 04. Aug 2021, 21:45

Hallo,

bin zufällig darüber gestolpert ... http://www.vboffice.net/en/developers/l ... ubfolders/

Sabina
Benutzeravatar
Flotter Feger
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3327
Registriert: 24. Okt 2016, 16:40

Re: VBA - OLK-Unterordner über Pfad ansprechen

Beitragvon 1Matthias » 05. Aug 2021, 10:36

Moin!
Deine Frage war ja:
Wie kann ich auf dem einfachsten Weg den gewünschten Ordner einer Objekt-Variablen zuweisen?

M.E. ist die einfachste Möglichkeit, die in deinem Ausgangspost. Also den String splitten und dann in einer normalen Schleife die Ordner "setzen". War bei dir das hier:
Code: Alles auswählen
For i = 1 To UBound(strArr)                                 '  Schleife durch alle weiteren Ebenen
      Set olkFld = olkFld.Folders(strArr(i))                    '    Initialisiere die Ordner-Variable (weitere Ebenen)
    Next i

Ein rekursiver Durchlauf ist da nicht notwendig (für die Objektzuweisung auf den gewählten PFad). Habe so was ähnliches auf der Arbeit auch für Kollegen gebastelt, da sie einfach die Mails archivieren wollten. Wobei auf Grund der Vielzahl der möglichen Ordner immer nur die Ordner der entsprechenden Ebene angezeigt werden.
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 972
Registriert: 15. Aug 2017, 18:36


Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast