Як рекурсивно пройти дерево папок у Outlook через VBA

Поділитися зараз:

Якщо в головній папці «Вхідні» або «Надіслані» є підпапки, дуже корисною порадою є те, як рекурсивно та ефективно обходити їх за допомогою VBA. Цю важливу частину можна повторно використовувати в багатьох інших проектах VBA.

Критична проблема проходження папок

Дерево папок в OutlookКорпоративні та комерційні користувачі Outlook часто мають сотні підпапок під головною папкою "Вхідні" або "Надіслані", з відповідними електронними листами в кожній з них. Коли виникає потреба переглянути всі ці папки, щоб виконати якусь дію з електронними листами, що містяться в них, написання різних сценаріїв VBA для різних папок стає кошмаром. Уявіть собі, що у вас є п'ятсот папок під головною папкою "Вхідні" та вимога до сценарію VBA для кожної з них. Користувачеві доведеться написати п'ятсот унікальних сценаріїв для кожної з цих папок з подібною функціональністю. Що ще гірше, якщо виникне потреба внести деякі зміни, всі п'ятьсот сценаріїв потрібно буде оновити. На щастя, існує методологія програмування, відома як рекурсія, яка вирішує нашу проблему дуже швидко. Ідея рекурсії полягає в тому, що функція неодноразово викликає себе та повторює той самий шаблон знову і знову, щоб обробити всі елементи з тією ж логікою. Нижче наведено приклад сценарію, який починається з головної папки "Вхідні" та перебирає всі підпапки та елементи в кожній з цих папок.

Сценарій Outlook VBA

Нижче наведено повний сценарій Outlook VBA:

Private Sub Main()
    Dim objNameSpace As Outlook.NameSpace
    Dim objMainFolder As Outlook.Folder
    
    Set objNameSpace = Application.GetNamespace("MAPI")
    Set objMainFolder = objNameSpace.GetDefaultFolder(olFolderInbox)
    
    Call ProcessCurrentFolder(objMainFolder)
End Sub
 
Private Sub ProcessCurrentFolder(ByVal objParentFolder As Outlook.MAPIFolder)
    Dim objCurFolder As Outlook.MAPIFolder
    Dim objMail As Outlook.MailItem
    
    On Error Resume Next
    
    '    Process each items in the folder
    For Each objMail In objParentFolder.Items
        '    Do your task here ...
    Next
    
    '    Process the subfolders in the folder recursively
    If (objParentFolder.Folders.Count > 0) Then
        For Each objCurFolder In objParentFolder.Folders
            Call ProcessCurrentFolder(objCurFolder)
        Next
    End If
End Sub

Як запустити сценарій

Преса Alt + F11 Щоб відкрити редактор VBA Outlook, і вставте наведений вище код у «ThisOutlookSession». Важливо знати, що перед запуском цього скрипта до посилань на проекти з меню «Інструменти» слід додати бібліотеку об’єктів Microsoft Outlook XX, де XX – це версія бібліотеки.

Зрозумійте сценарій

Функція рекурсії«ProcessCurrentFolder» – це рекурсивна функція, яка викликає себе, якщо в поточній папці виявлено підпапку. Вона продовжуватиме викликати себе, доки не будуть проскановані та оброблені всі папки, починаючи з початкової ієрархії. Цей скрипт працюватиме з будь-якою папкою Outlook. «olFolderInbox» можна замінити на «olFolderSentMail», «olFolderOutbox» або будь-яку іншу папку Outlook, яка не є папкою за замовчуванням. Також важливо знати, що не обов'язково робити початковий виклик з кореневої папки вхідних або вихідних повідомлень, але вона може починати працювати з будь-якої папки вниз. «For Each objMail In objParentFolder.Items» – це ключовий рядок, який перебиратиме всі елементи, що містяться в поточній папці, що сканується; тому саме там користувачеві потрібно розмістити необхідний код для обробки елементів.

Відновлення після катастрофи

Якщо ви зіткнулися з ситуацією збою або збоєм Outlook, не потрібно турбуватися про втрачені електронні листи, оскільки DataNumen поверне ваше життя в нормальне русло виправлення пошкоджень Outlook ефективним способом.

Вступ автора:

Мері Андервуд - експерт із відновлення даних у DataNumen, Inc., яка є світовим лідером у галузі технологій відновлення даних, в тому числі відновлення DWG та rar відновлення програмних продуктів. Для отримання додаткової інформації відвідайте WWW.datanumen.com

Поділитися зараз:

Коментарі закриті.