VBOffice

Rekursive Ordnersuche

Das Script zeigt, wie Sie rekursiv in einer Schleife durch alle Ordnerebenen laufen können.

Zuletzt geändert: 28.03.2015 | Aufrufe: 102.035  | #12
◀ Vorheriges Beispiel Nächstes Beispiel ▶

Inhalt

ReplyAll ReplyAll
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten.

Outlook-Objektmodell: Alle Ordner auflisten

Mit einer rekursiven Schleife durch alle Ordner können Sie die Inhalte sämtlicher Ordner lesen, ohne jeden Ordner gezielt über den Namen ansprechen zu müssen. Das ist z.B. dann nützlich, wenn Sie zur Programmierzeit gar nicht wissen, welche Ordner oder Ordnerstruktur es geben wird. Die folgenden Beispiele zeigen den grundlegenden Aufbau anhand von Emails. Was dann mit dem Ordnerinhalt angestellt wird, ist ausgelagert, so dass das Gerüst leicht wiederverwendet werden.


tip  So fügen Sie Makros in Outlook ein
Public Sub LoopFolders(Folders As Outlook.Folders, _
  ByVal Recursive As Boolean _
)
  Dim Folder As Outlook.MAPIFolder

  For Each Folder In Folders
    DoAnything Folder

    If Recursive Then
      LoopFolders Folder.Folders, Recursive
    End If
  Next
End Sub

Private Sub DoAnything(Folder As Outlook.MAPIFolder)
  Debug.Print Folder.Name
End Sub
OLKeeper OLKeeper
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schließen und so etwa wichtige Emails verpassen würden.

Praktische Anwendung: Ordnereigenschaften ändern

Hier kommt eine praktische Anwendung für eine rekursive Schleife durch alle Ordner: Wir legen für einen auszuwählenden Ordner und seine Unterordner fest, dass nicht die Anzahl aller ungelesenen Elemente angezeigt werden soll, sondern die Anzahl aller Elemente.

Fügen Sie die Funktion 'ChangeFolderSettings' zu den obigen beiden hinzu. Beachten Sie die Variable 'EditSubfoldersOnly': Hierüber wird gesteuert, ob die Änderungen nur auf die gewählten Unterordner oder auch auf den Startordner selbst angewendet werden sollen.

Public Sub ChangeFolderSettings()
  Dim Folder As Outlook.MapiFolder
  Dim EditSubfoldersOnly As Boolean

  'Startordner auswählen
  Set Folder = Application.Session.PickFolder

  'True ändert nur die Unterordner, False ändert auch den Startordner
  EditSubfoldersOnly = False

  If Not Folder Is Nothing Then
    If EditSubfoldersOnly = False Then DoAnything Folder

    LoopFolders Folder.Folders, True
  End If
End Sub

In der Funktion 'DoAnything' ändert sich nur eine einzige Zeile:

Private Sub DoAnything(Folder As Outlook.MAPIFolder)
  'Eigenschaft auf True setzen zeigt die Anzahl aller Elemente, 
  'False würde nur die Anzahl der ungelesenen Elemente anzeigen
  Folder.ShowItemCount = True
End Sub

Outlook-Objektmodell: Alle Ordnerinhalte auflisten

Dieses Beispiel erweitert die Schleife durch alle Ordner um eine Schleife durch alle Elemente jedes Ordners.

Public Sub LoopFolders(Folders As Outlook.Folders, _
  ByVal Recursive As Boolean _
)
  Dim Folder As Outlook.MAPIFolder

  For Each Folder In Folders
    LoopItems Folder.Items

    If Recursive Then
      LoopFolders Folder.Folders, Recursive
    End If
  Next
End Sub

Private Sub LoopItems(Items As Outlook.Items)
  Dim obj As Object

  For Each obj In Items
    If TypeOf obj Is Outlook.MailItem
      DoAnything obj
    End If
  Next
End Sub

Private Sub DoAnything(Item As Outlook.MailItem)
  Debug.Print Item.Subject
End Sub
Reporter Reporter
Mit dem Reporter erstellen Sie Berichte für Ihre Outlook Daten. Mit wenigen Klicks werden Werte aus Aufgaben, Terminen und dem Journal summiert.

CDO 1.21: Alle Ordner auflisten

Die obigen Beispiele mit dem OOM funktionieren mit allen Outlook-Versionen, sind aber bis einschließlich Outlook 2003 relativ langsam. Viel schneller geht es da mit der CDO 1.21 Bibliothek.

Public Sub LoopFolders(Folders As MAPI.Folders, _
  ByVal Recursive As Boolean _
)
  Dim Folder As MAPI.Folder

  For Each Folder In Folders
    DoAnything Folder

    If Recursive Then
      LoopFolders Folder.Folders, Recursive
    End If
  Next
End Sub

Private Sub DoAnything(Folder As MAPI.Folder)
  Debug.Print Folder.Name
End Sub

CDO 1.21: Alle Ordnerinhalte auflisten

Hier die CDO-Variante zum Auflisten aller Ordnerinhalte.

Public Sub LoopFolders(Folders As MAPI.Folders, _
  ByVal Recursive As Boolean _
)
  Dim Folder As MAPI.Folder

  For Each Folder In Folders
    LoopItems Folder.Messages

    If Recursive Then
      LoopFolders Folder.Folders, Recursive
    End If
  Next
End Sub

Private Sub LoopItems(Items As MAPI.Messages)
  Dim obj As Object

  For Each obj In Items
    If TypeOf obj Is MAPI.Message
      DoAnything obj
    End If
  Next
End Sub

Private Sub DoAnything(Item As MAPI.Message)
  Debug.Print Item.Subject
End Sub
SAM SAM
Legen Sie fest, mit welcher "Identität" Ihre Emails beim Empfänger erscheinen sollen. Mit SAM bestimmen Sie den Absender und Speicherort für Emails anhand von Regeln.
email  Senden Sie eine Nachricht