Получить список папок, упорядоченный как отображается - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь получить все имена подпапок в указанной папке c Outlook, упорядоченной так, как показано в приложении GUI.

Я могу получить ее только по дате создания.

Мой код:

Sub getFoldersList()

    Dim objMainFolder As Outlook.folder
    Set objMainFolder = Application.Session.GetDefaultFolder(olFolderInbox).Folders("my_folder_name")

    Dim folder As Outlook.folder
    Dim Report As String

    For Each folder In objMainFolder.Folders
        Report = Report & folder.Name & vbCrLf
    Next

    MsgBox Report

End Sub

ОБНОВЛЕНИЕ

По предложению Дмитрий Стребленченко , я пытался получить свойство PR_SORT_POSITION из моего списка папок. Этот подход не должен показывать папки в правильном порядке, но, по крайней мере, я смог бы отсортировать их позже. Я изменил folder.Name из моего предыдущего кода (в пределах For Each l oop) с: folder.PropertyAccessor.GetProperty.PR_SORT_POSITION Это приводит к Ошибка компиляции и с: folder.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x30200102") Этот звук связан со мной, потому что я предполагаю, что он будет пытаться подключиться к schemas.microsoft.com каждый раз, но в любом случае я получаю Ошибка времени выполнения, свойство не найдено для некоторых моих папок, пока другой показывает непонятные символы, когда я ожидал какие-то цифры.

ОБНОВЛЕНИЕ 2

Мне удалось установить OutlookSpy для проверки свойств папки. Все они имеют PR_SORT_POSITION, за исключением одного, который сообщает его значение как MAPI_E_NOT_FOUND. Я только что переместил эту папку, и она получила допустимое значение типа PT_BINARY. Вот пример значения cb:2 lpb:00 3F, которое должно быть шестнадцатеричным значением 00 3F. Можно правильно отсортировать папки в OutlookSpy IMAPIFOlder explorer по PR_SORT_POSITION, и мне интересно, почему это невозможно с помощью сценария VBA (см. Также подробности «Ошибка при погашении»), Я попытался преобразовать эти значения в более читаемое и полезное целое число, используя следующий код:

For Each folder In objMainFolder.Folders
        folder_index_property = folder.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x30200102")
        folder_index = folder.PropertyAccessor.BinaryToString(folder_index_property)
        MsgBox folder.Name & ", " & CInt("&h0" & folder_index) 
Next

В результате он дает мне число, но с некоторыми дубликатами, потому что значения как value: cb:2 lpb:00 1F и value: cb:1 lpb:1F оба преобразуются в 31, кажется, игнорируется cb часть значения свойства.

ПРОЧАЯ ИНФОРМАЦИЯ: Ошибка выкупа

I Также пытался установить redemption.dll как с regsvr32.exe, так и с надстройкой Outlook (которая работала для OutlookSpy). В обоих случаях он показывает мне лицензионное соглашение и, кажется, правильно установлен, но не смог выполнить скрипт на Session.MAPIOBJECT с ошибка невозможно найти метод или элемент данных Я также проверил Redemption Outlook and MAPI COM Library в Tools > Reference

ВОЗМОЖНОЕ РЕШЕНИЕ

Я нашел возможное решение, объединяющее руководство по погашению и этой темы Использование Session.Logon вместо Session.MAPIOBJECT = Application.Session.MAPIOBJECT и переименование Session с другим словом, например RedSession.

Здесь мой рабочий код:

Set RedSession = CreateObject("Redemption.RDOSession")
RedSession.Logon
Set folder = RedSession.GetDefaultFolder(olFolderInbox).Folders("my_folder_name")
'sort on two properties PR_SORT_POSITION and PR_DISPLAY_NAME_W
Dim sortProps()
ReDim sortProps(1)
sortProps(0) = &H30200102  'PR_SORT_POSITION
sortProps(1) = &H3001001F  'PR_DISPLAY_NAME_W
Dim sorts()
ReDim sorts(1)
sorts(0) = False
sorts(1) = False
Set SubFolders = folder.Folders
SubFolders.Sort sortProps, sorts
'objMainFolder.Sort sortProps, sorts

Report = ""

For Each f In SubFolders
  IsHidden = f.Fields(&H10F4000B) 'PR_ATTR_HIDDEN
  If Not IsHidden Then
    'Debug.Print f.Name
    Report = Report & f.Name & vbCrLf
  End If
Next

MsgBox Report

Все еще интересует, как извлечь свойство PR_SORT_POSITION в удобочитаемом формате

1 Ответ

0 голосов
/ 28 февраля 2020

Если папки были вручную переставлены пользователем, порядок сохраняется в свойстве PR_SORT_POSITION для папки - см. https://docs.microsoft.com/en-us/archive/blogs/stephen_griffin/mapi-provider-sorting

В общем, сортировка по PR_SORT_POSITION, затем по имени папки.

Имейте в виду, что объектная модель Outlook не позволяет сортировать коллекцию папок (в отличие от коллекции элементов). Вам необходимо явно отсортировать папки в своем коде.

Если вы используете Погашение , вы можете использовать скрипт, аналогичный приведенному ниже (он сортирует папки верхнего уровня магазин по умолчанию в профиле)

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set folder = Session.Stores.DefaultStore.IPMRootFolder
'sort on two properties PR_SORT_POSITION and PR_DISPLAY_NAME_W
Dim sortProps()
Redim sortProps(1)
sortProps(0) =  &H30200102 'PR_SORT_POSITION
sortProps(1) =  &H3001001F 'PR_DISPLAY_NAME_W
dim sorts()
Redim sorts(1)
sorts(0) = false
sorts(1) = false
set subFolders = folder.Folders
subFolders.Sort sortProps, sorts
for each f in subFolders
  isHidden = f.Fields(&H10F4000B) 'PR_ATTR_HIDDEN
  if not isHidden Then
    Debug.Print f.Name
  End If
next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...