outlook-vba
Введение Часть 3: Магазины и все их папки
Поиск…
Вступление
Завершает введение в магазины и папки, запущенные во второй части этого руководства
Ожидаемые предварительные знания : вы изучили часть 2 этого руководства или уже знакомы с его содержанием.
3. 0 Содержание
- Как ссылаться на любую доступную папку.
- Как получить полное имя ссылочной папки.
- Пара подпрограмм, которые вместе перечислит каждую папку в каждом доступном хранилище.
- Процедура перемещения папки из одной родительской папки в другую.
3.1 Функция GetFldrNames (), которая необходима для нескольких демонстрационных макросов
Ряд демонстрационных макросов в этой части требует функции, которую я объясню позже. На данный момент просто скопируйте GetFldrNames()
в подходящий модуль. Я часто использую эту функцию и сохраняю ее, а также другую, что я использую во многих разных макросах, в модуле с именем «ModGlobalOutlook». Вы можете сделать то же самое. Кроме того, вы можете предпочесть сохранить макрос со всеми другими макросами в этой серии уроков; вы можете переместить его позже, если вы передумаете.
Public Function GetFldrNames(ByRef Fldr As Folder) As String()
' * Fldr is a folder. It could be a store, the child of a store,
' the grandchild of a store or more deeply nested.
' * Return the name of that folder as a string array in the sequence:
' (0)=StoreName (1)=Level1FolderName (2)=Level2FolderName ...
' 12Oct16 Coded
' 20Oct16 Renamed from GetFldrNameStr and amended to return a string array
' rather than a string
Dim FldrCrnt As Folder
Dim FldrNameCrnt As String
Dim FldrNames() As String
Dim FldrNamesRev() As String
Dim FldrPrnt As Folder
Dim InxFN As Long
Dim InxFnR As Long
Set FldrCrnt = Fldr
FldrNameCrnt = FldrCrnt.Name
ReDim FldrNamesRev(0 To 0)
FldrNamesRev(0) = Fldr.Name
' Loop getting parents until FldrCrnt has no parent.
' Add names of Fldr and all its parents to FldrName as they are found
Do While True
Set FldrPrnt = Nothing
On Error Resume Next
Set FldrPrnt = Nothing ' Ensure value is Nothing if following statement fails
Set FldrPrnt = FldrCrnt.Parent
On Error GoTo 0
If FldrPrnt Is Nothing Then
' FldrCrnt has no parent
Exit Do
End If
ReDim Preserve FldrNamesRev(0 To UBound(FldrNamesRev) + 1)
FldrNamesRev(UBound(FldrNamesRev)) = FldrPrnt.Name
Set FldrCrnt = FldrPrnt
Loop
' Copy names to FldrNames in reverse sequence so they end up in the correct sequence
ReDim FldrNames(0 To UBound(FldrNamesRev))
InxFN = 0
For InxFnR = UBound(FldrNamesRev) To 0 Step -1
FldrNames(InxFN) = FldrNamesRev(InxFnR)
InxFN = InxFN + 1
Next
GetFldrNames = FldrNames
End Function
3.2 Ссылка на папку по умолчанию
В TestDefaultFldr()
я установил Fldr
в папку «Входящие» по умолчанию. Постоянный olFolderInbox
можно заменить другими значениями, предоставляющими доступ к любой из папок по умолчанию. Если вы Set Fldr = Session.GetDefaultFolder(
, в редакторе VB появится выпадающий список всех возможных значений.
Sub TestDefaultFldr()
Dim Fldr As Folder
Set Fldr = Session.GetDefaultFolder(olFolderInbox)
Debug.Print Join(GetFldrNames(Fldr), "|")
End Sub
На моем ноутбуке TestDefaultFldr()
отображает Outlook data file|Inbox
который стал неожиданностью. Я написал GetFldrNames(Fldr)
чтобы убедиться, что папка, на которую я ссылался, была той, которую я хотел. Я получил доступ к папке «Входящие» по умолчанию и обнаружил, что он пуст! Магазин «Выходной файл данных» поставляется с установкой по умолчанию, и я проигнорировал его, так как Outlook создал хранилище для каждой из моих учетных записей электронной почты. Только после того, как я обнаружил свой пустой почтовый ящик по умолчанию, я подумал о том, как Outlook будет знать, какая из моих учетных записей электронной почты была учетной записью, которую я хотел бы использовать по умолчанию. Из стандартных папок Outlook по умолчанию нет или по умолчанию находится «Выходной файл данных». Возможно, будет возможно изменить, какой из входящих сообщений является папкой «Входящие» по умолчанию, но я не исследовал, потому что я не уверен, какие из моих учетных записей электронной почты я бы сделал по умолчанию, если бы я это изменил. Просто помните, что все ваши элементы календаря, задачи и т. Д. Находятся в «файле данных Outlook» и убедитесь, что вы включили «Outlook.pst» в свой список архивов.
Большинство объектов Outlook имеют свойство Parent
. GetFldrNames(Fldr)
записывает имя папки в массиве, прежде чем пытаться получить доступ к ее родительскому GetFldrNames(Fldr)
. Он циклически добавляет имена в конец массива, пока не достигнет магазина. В хранилище нет родителя, поэтому попытка доступа к нему не выполняется. Последовательность имен в массиве меняется на обратный и затем возвращается вызывающему. Я использовал Join
чтобы превратить массив имен в отображаемую строку.
3.3. Ссылка на любую папку в любом доступном хранилище
TestFldrChain()
демонстрирует, как ссылаться на любую папку в любом доступном хранилище:
Sub TestFldrChain()
Dim Fldr As Folder
Set Fldr = Session.Folders("A").Folders("A2"). _
Folders("A21").Folders("A213")
Debug.Print Join(GetFldrNames(Fldr), "|")
End Sub
В TestFldrChain()
: A - имя магазина; A2 - имя папки внутри A; A21 - это имя папки в A2, а A213 - имя папки в A21.
Что здесь происходит?
Session
имеет свойство Folders
которое является списком всех доступных магазинов.
Session.Folders(integer)
, который я использовал во второй части этого учебника, позволяет мне последовательно проходить через магазины, когда я не знаю их имен. Session.Folders("A")
позволяет мне получить доступ к папке, когда я знаю ее имя.
Session.Folders("A")
- это папка, и у нее тоже есть свойство Folders
.
Session.Folders("A").Folders("A2")
дают мне доступ к папке «A2» в магазине «A».
Я могу связать столько Folders("x")
s, сколько необходимо для доступа к любой папке. Если цепочка слишком длинная для одной строки, вы можете разделить оператор на несколько строк, как я.
Ищите самую глубоко вложенную папку в вашей установке и замените A, A2, A21 и A213 именами вашего магазина и папок. При необходимости увеличивайте или уменьшайте количество папок в цепочке.
Если вы обновите и запустите TestFldrChain()
, он выведет следующее, за исключением того, что A, A2 и т. Д. Будут заменены вашими именами папок:
A|A2|A21|A213
3.4. Листинг имен каждой папки в каждом доступном хранилище
В части 2 вам было показано, как перечислять все доступные хранилища и папки верхнего уровня в каждом магазине. Это включало цикл через магазины, а затем цикл для каждого хранилища через его папки. Вы уже видели, как ссылаться на известную папку на любой глубине в иерархии папок. Это связано с объединением целых Folders("x")
s, необходимых для доступа к папке.
Теперь я хочу перечислить каждую папку на любой глубине в каждом магазине. Самый простой способ кодирования для решения проблемы такого типа, где вы должны двигаться вниз по цепочкам различной длины, - это рекурсия . Если вы серьезный программист на другом языке или инструменте, вы, возможно, уже знаете о рекурсии. Если у вас есть амбиции быть серьезным программистом, вам нужно будет понять рекурсию в конце концов, но не обязательно сегодня. «Рекурсия» - одна из тех концепций, которые многим трудно понять вначале. Вы можете ввести «Recursion» в свою любимую поисковую систему и прочитать различные попытки объяснить эту концепцию. Кроме того, вы можете принять эти макросы, но не беспокоиться о том, как они работают.
Обратите внимание на комментарий в ListStoresAndAllFolders()
: этим макросам нужна ссылка на «Время выполнения сценариев Microsoft». Нажмите « Инструменты» на панели вкладок в верхней части окна «Редактор VB» и нажмите « Ссылки» . Вы получите список всех доступных ссылок (библиотек). Некоторые наверху уже будут отмечены галочкой. Остальные в алфавитном порядке. Прокрутите список вниз и нажмите на поле слева от «Microsoft Scripting Runtime», чтобы получить отметку. Затем нажмите « ОК».
Sub ListStoresAndAllFolders()
' Displays the name of every accessible store
' Under each store, displays an indented list of all its folders
' Technique for locating desktop from answer by Kyle:
' http://stackoverflow.com/a/17551579/973283
' Needs reference to “Microsoft Scripting Runtime” if "TextStream"
' and "FileSystemObject" are to be recognised
Dim FileOut As TextStream
Dim FldrCrnt As Folder
Dim Fso As FileSystemObject
Dim InxFldrCrnt As Long
Dim InxStoreCrnt As Long
Dim Path As String
Dim StoreCrnt As Folder
Path = CreateObject("WScript.Shell").SpecialFolders("Desktop")
Set Fso = CreateObject("Scripting.FileSystemObject")
Set FileOut = Fso.CreateTextFile(Path & "\ListStoresAndAllFolders.txt", True)
With Application.Session
For InxStoreCrnt = 1 To .Folders.Count
Set StoreCrnt = .Folders(InxStoreCrnt)
With StoreCrnt
FileOut.WriteLine .Name
For InxFldrCrnt = .Folders.Count To 1 Step -1
Set FldrCrnt = .Folders(InxFldrCrnt)
Call ListAllFolders(FldrCrnt, 1, FileOut)
Next
End With
Next
End With
FileOut.Close
End Sub
Sub ListAllFolders(ByRef Fldr As Folder, ByVal Level As Long, ByRef FileOut As TextStream)
' This routine:
' 1. Output name of Fldr
' 2. Calls itself for each child of Fldr
' It is designed to be called by ListStoresAndAllFolders()
Dim InxFldrCrnt As Long
With Fldr
FileOut.WriteLine Space(Level * 2) & .Name
For InxFldrCrnt = .Folders.Count To 1 Step -1
Call ListAllFolders(.Folders(InxFldrCrnt), Level + 1, FileOut)
Next
End With
End Sub
После запуска ListStoresAndAllFolders
на вашем DeskTop появится новый файл с именем «ListStoresAndAllFolders.txt», который будет содержать обещанный список магазинов и папок.
3.5 Перемещение папки из одной родительской папки в другую
Почему я хочу ссылаться на папку? В следующей части я покажу вам, как получить доступ к электронным письмам в указанной папке. Здесь я покажу вам, как переместить папку. Я создал папку с именем «Тест» в моей папке «Входящие». В TestMoveFolder()
я заменил «A» на имя хранилища, содержащего мою папку «Входящие». Выполнение TestMoveFolder()
перенесло «Тест» на «Удаленные элементы».
Sub TestMoveFolder()
Dim FldrDest As Folder
Dim FldrToMove As Folder
Set FldrToMove = Session.Folders("A").Folders("Inbox").Folders("Test")
Set FldrDest = Session.Folders("A").Folders("Deleted Items")
FldrToMove.MoveTo FldrDest
End Sub
3.6 Что вы должны помнить из этой части учебника
- Как ссылаться на папку по умолчанию и возможные ограничения этой техники.
- Как ссылаться на любую отдельную папку на любой глубине в любом доступном хранилище.
- Как отобразить полное имя ссылочной папки.
- Как обратиться к одной из многих, многих доступных библиотек, которые предоставляют функциональные возможности, помимо набора подпрограмм и функций по умолчанию.
- Как отобразить имя каждой папки в каждом доступном хранилище.
- Как переместить папку из одной родительской папки в другую.