Я пытаюсь получить все имена подпапок в указанной папке 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
в удобочитаемом формате