Outlook VBA: Iterate recursively over folders
2 min read

Outlook VBA: Iterate recursively over folders

Outlook VBA: Iterate recursively over folders

Note: This is a post transferred from Laurii for historical and consolidation purposes.

As part of the program I've started, I had to perform a recursive walking of all sub-folders from a starting point in a .pst file. Code looks like this:

Sub WalkFolders(fnum)

    Dim olApp As Outlook.Application
    Dim olSession As Outlook.NameSpace
    Dim olStartFolder As Outlook.MAPIFolder

    lCountOfFound = 0

    Set olApp = New Outlook.Application
    Set olSession = olApp.GetNamespace("MAPI")

    ' Allow the user to pick the folder in which to start the search.
    Set olStartFolder = olSession.PickFolder

    ' Check to make sure user didn't cancel PickFolder dialog.
    If Not (olStartFolder Is Nothing) Then
        ' Start the search process.
        ProcessFolder olStartFolder, fnum
    End If

    ' Pop up a dialog box at the end
    MsgBox "Done" & olStartFolder.FolderPath

End Sub

This doesn't do too much... It selects a folder and calls a function. The recursive part is below:

' Parameters:
'  CurrentFolder: the current folder to walk
'  fnum         : the writeable file (see http://www.laurivan.com/outlook-vba-write-to-a-file/)
Sub ProcessFolder(CurrentFolder As Outlook.MAPIFolder, fnum)

    Dim i As Long
    Dim olNewFolder As Outlook.MAPIFolder
      ' late bind this object variable, since it could be various item types
    Dim olTempFolder As Outlook.MAPIFolder
    Dim olTempFolderPath As String

    ' Loop through the items in the current folder.
    ' Looping through backwards in case items are to be deleted,
    ' as this is the proper way to delete items in a collection.
    For i = CurrentFolder.Folders.Count To 1 Step -1

        Set olTempFolder = CurrentFolder.Folders(i)

        ' Do some post-processing for each item
    Next

    ' Call some generic function
    ProcessGeneric CurrentFolder, fnum

    ' Loop through and search each subfolder of the current folder.
    For Each olNewFolder In CurrentFolder.Folders

        'Don't need to process the Deleted Items folder
        If olNewFolder.name <> "Deleted Items" Then
            ' Call recursively the walking function
            ProcessFolder olNewFolder, fnum
        End If

    Next

End Sub

Now, you can process each item in the directory in the first loop and elegantly call a per-item processor (d'oh!). Other than that, VBA in Outlook 2003 is not nice... The tiniest mistake, you get an error. It doesn't like something (like strings and objects), you get an error. Not nice after processing 100 emails to get something like Mismatched objects... Still, it's quicker than doing a C# :(