Szukaj…


Wprowadzenie

Uzupełnia wprowadzenie do sklepów i folderów rozpoczęte w części 2 tego samouczka

Oczekiwana wcześniejsza wiedza : Przestudiowałeś część 2 tego samouczka lub znasz już jego treść.

3. 0 Spis treści

  • Jak odwoływać się do dowolnego dostępnego folderu.
  • Jak uzyskać pełną nazwę folderu, do którego istnieje odwołanie.
  • Para procedur, które razem wyświetlą listę wszystkich folderów w każdym dostępnym sklepie.
  • Procedura przenoszenia folderu z jednego folderu nadrzędnego do drugiego.

3.1 Funkcja GetFldrNames (), która jest potrzebna dla kilku makr demonstracyjnych

Wiele makr demonstracyjnych w tej części wymaga funkcji, którą wyjaśnię później. Na razie skopiuj GetFldrNames() do odpowiedniego modułu. Korzystam z tej funkcji często i zachowuję ją, a inne podobne, których używam w wielu różnych makrach, w module o nazwie „ModGlobalOutlook”. Możesz zrobić to samo. Alternatywnie, możesz chcieć zachować makro z wszystkimi innymi makrami z tej serii samouczków; możesz go przenieść później, jeśli zmienisz zdanie.

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 Odwoływanie się do domyślnego folderu

W TestDefaultFldr() ustawiłem Fldr na domyślną skrzynkę odbiorczą. Stała olFolderInbox może zostać zastąpiona innymi wartościami, umożliwiającymi dostęp do dowolnego z domyślnych folderów. Jeśli wpiszesz Set Fldr = Session.GetDefaultFolder( , edytor VB wyświetli rozwijaną listę wszystkich możliwych wartości.

Sub TestDefaultFldr()

  Dim Fldr As Folder

  Set Fldr = Session.GetDefaultFolder(olFolderInbox)

  Debug.Print Join(GetFldrNames(Fldr), "|")

End Sub

Na moim laptopie TestDefaultFldr() wyświetla Outlook data file|Inbox co było niespodzianką. Napisałem GetFldrNames(Fldr) aby upewnić się, że folder, do którego się GetFldrNames(Fldr) był tym, którego chciałem. Uzyskałem dostęp do domyślnej skrzynki odbiorczej i okazało się, że jest pusta! Sklep „Plik danych wyjściowych” został dostarczony z domyślną instalacją i zignorowałem go, ponieważ program Outlook utworzył magazyn dla każdego z moich kont e-mail. Dopiero po odkryciu mojej pustej domyślnej skrzynki odbiorczej pomyślałem o tym, jak program Outlook będzie wiedział, które z moich kont e-mail to konto, które chciałbym wybrać jako domyślne. W przypadku standardowych folderów programu Outlook nie ma wartości domyślnej lub wartość domyślna znajduje się w „pliku danych wyjściowych”. Możliwe, że można zmienić domyślną skrzynkę odbiorczą, ale nie sprawdziłem, ponieważ nie jestem pewien, które z moich kont e-mail ustawiłbym jako domyślne, gdybym to zmienił. Pamiętaj tylko, że wszystkie elementy kalendarza, zadania itp. Znajdują się w „pliku danych programu Outlook” i upewnij się, że na liście archiwów znajduje się „Outlook.pst”.

Większość obiektów programu Outlook ma właściwość Parent . GetFldrNames(Fldr) zapisuje nazwę folderu w tablicy przed próbą uzyskania dostępu do jego elementu nadrzędnego. Pętli dodaje nazwy na końcu tablicy, dopóki nie dotrze do sklepu. Sklep nie ma elementu nadrzędnego, więc próba dostępu do niego kończy się niepowodzeniem. Sekwencja nazw w tablicy jest odwracana, a następnie zwracana do osoby dzwoniącej. Użyłem Join aby przekształcić tablicę nazw w ciąg znaków, który można wyświetlić.

3.3 Odwoływanie się do dowolnego folderu w dowolnym dostępnym sklepie

TestFldrChain() pokazuje, jak odwoływać się do dowolnego folderu w dowolnym dostępnym sklepie:

Sub TestFldrChain()

  Dim Fldr As Folder

  Set Fldr = Session.Folders("A").Folders("A2"). _
                           Folders("A21").Folders("A213")

  Debug.Print Join(GetFldrNames(Fldr), "|")

End Sub    

W TestFldrChain() : A jest nazwą sklepu; A2 to nazwa folderu w A; A21 to nazwa folderu w A2, a A213 to nazwa folderu w A21.

Co tu się dzieje?

Session ma właściwość Folders która jest listą wszystkich dostępnych sklepów.

Session.Folders(integer) , którego użyłem w części 2 tego samouczka, pozwala mi przechodzić przez sklepy w kolejności, gdy nie znam ich nazw. Session.Folders("A") pozwala mi uzyskać dostęp do folderu, gdy znam jego nazwę.

Session.Folders("A") jest folderem i również ma właściwość Folders .

Session.Folders("A").Folders("A2") dają mi dostęp do folderu „A2” w sklepie „A”.

Mogę połączyć dowolną liczbę Folders("x") aby uzyskać dostęp do dowolnego folderu. Jeśli łańcuch jest za długi na jedną linię, możesz podzielić instrukcję na kilka linii, tak jak ja.

Poszukaj najbardziej zagnieżdżonego folderu w instalacji i zastąp A, A2, A21 i A213 nazwami swojego sklepu i folderów. W razie potrzeby zwiększ lub zmniejsz liczbę folderów w łańcuchu.

Jeśli zaktualizujesz i uruchomisz TestFldrChain() , wyświetli on następujące dane, z wyjątkiem tego, że A, A2 itd. Zostaną zastąpione nazwami folderów:

A|A2|A21|A213 

3.4 Lista nazw wszystkich folderów w każdym dostępnym sklepie

W części 2 pokazano, jak wyświetlić listę każdego dostępnego sklepu i folderów najwyższego poziomu w każdym sklepie. Obejmowało to pętlę przez sklepy, a następnie pętlę dla każdego sklepu przez jego foldery. Powyżej widziałeś, jak odwoływać się do znanego folderu na dowolnej głębokości w hierarchii folderów. Wiązało się to z połączeniem ze sobą jak największej liczby Folders("x") aby uzyskać dostęp do folderu.

Chcę teraz wyświetlić listę każdego folderu, na dowolnej głębokości, w każdym sklepie. Najłatwiejszą techniką kodowania w celu rozwiązania tego rodzaju problemu, w którym należy poruszać się w dół łańcuchów o różnych długościach, jest rekurencja . Jeśli jesteś poważnym programistą w innym języku lub narzędziu, możesz już wiedzieć o rekurencji. Jeśli masz ambicje być poważnym programistą, w końcu musisz zrozumieć rekurencję, ale niekoniecznie dzisiaj. „Rekurencja” jest jedną z tych koncepcji, które wielu z początku trudno zrozumieć. Możesz wpisać „Recursion” w swojej ulubionej wyszukiwarce i przeczytać różne próby wyjaśnienia tej koncepcji. Możesz też zaakceptować te makra, ale nie martw się, jak działają.

Zwróć uwagę na komentarz w ListStoresAndAllFolders() : te makra wymagają odniesienia do „Microsoft Scripting Runtime”. Kliknij Narzędzia na pasku kart u góry okna Edytora VB, a następnie kliknij Odnośniki . Otrzymasz listę wszystkich dostępnych referencji (bibliotek). Niektóre na górze będą już zaznaczone. Pozostałe są w kolejności alfabetycznej. Przewiń listę i kliknij pole po lewej stronie „Microsoft Scripting Runtime”, aby zaznaczyć tik. Następnie kliknij OK

 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

Po uruchomieniu ListStoresAndAllFolders na twoim DeskTopie pojawi się nowy plik o nazwie „ListStoresAndAllFolders.txt”, który będzie zawierać obiecaną listę sklepów i folderów.

3.5 Przenoszenie folderu z jednego folderu nadrzędnego do drugiego

Dlaczego chcę odwoływać się do folderu? W następnej części pokażę ci, jak uzyskać dostęp do wiadomości e-mail w odnośnym folderze. Tutaj pokażę ci, jak przenieść folder. W skrzynce odbiorczej utworzyłem folder o nazwie „Test”. W TestMoveFolder() zamieniłem „A” na nazwę sklepu zawierającego moją skrzynkę odbiorczą. Uruchomienie TestMoveFolder() przeniosło „Test” do „Usunięte elementy”.

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 O czym powinieneś pamiętać z tej części samouczka

  • Jak odwoływać się do domyślnego folderu i możliwych ograniczeń tej techniki.
  • Jak odwoływać się do dowolnego pojedynczego folderu na dowolnej głębokości w dowolnym dostępnym sklepie.
  • Jak wyświetlić pełną nazwę folderu, do którego istnieje odwołanie.
  • Jak odwoływać się do jednej z wielu dostępnych bibliotek, które zapewniają funkcjonalność wykraczającą poza domyślny zestaw podprogramów i funkcji.
  • Jak wyświetlić nazwę każdego folderu w każdym dostępnym sklepie.
  • Jak przenieść folder z jednego folderu nadrzędnego do innego.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow