Поиск…


Вступление

Завершает введение в магазины и папки, запущенные во второй части этого руководства

Ожидаемые предварительные знания : вы изучили часть 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 Что вы должны помнить из этой части учебника

  • Как ссылаться на папку по умолчанию и возможные ограничения этой техники.
  • Как ссылаться на любую отдельную папку на любой глубине в любом доступном хранилище.
  • Как отобразить полное имя ссылочной папки.
  • Как обратиться к одной из многих, многих доступных библиотек, которые предоставляют функциональные возможности, помимо набора подпрограмм и функций по умолчанию.
  • Как отобразить имя каждой папки в каждом доступном хранилище.
  • Как переместить папку из одной родительской папки в другую.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow