Zoeken…


Invoering

Voltooit de introductie in winkels en mappen die in deel 2 van deze zelfstudie is gestart

Verwachte voorkennis : je hebt deel 2 van deze zelfstudie bestudeerd of bent al bekend met de inhoud.

3. 0 Inhoud

  • Hoe naar een toegankelijke map te verwijzen.
  • Hoe de volledige naam van een map waarnaar wordt verwezen te krijgen.
  • Een paar routines die samen elke map in elke toegankelijke winkel weergeven.
  • Een routine om een map van de ene bovenliggende map naar de andere te verplaatsen.

3.1 Functie GetFldrNames () die nodig is voor verschillende demonstratiemacro's

Een aantal demonstratiemacro's in dit deel vereist een functie die ik later zal toelichten. Kopieer GetFldrNames() gewoon GetFldrNames() naar een geschikte module. Ik gebruik deze functie vaak en bewaar deze, en andere soortgelijke die ik in veel verschillende macro's gebruik, in een module met de naam "ModGlobalOutlook". Misschien wilt u hetzelfde doen. Als alternatief wilt u misschien de macro behouden met alle andere macro's in deze zelfstudieserie; je kunt het later verplaatsen als je van gedachten verandert.

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 Verwijzen naar een standaardmap

In TestDefaultFldr() heb ik Fldr ingesteld op het standaard Postvak IN. De constante olFolderInbox kan worden vervangen door andere waarden die toegang geven tot een van de standaardmappen. Als u Set Fldr = Session.GetDefaultFolder( typt, Set Fldr = Session.GetDefaultFolder( de VB-editor een vervolgkeuzelijst met alle mogelijke waarden.

Sub TestDefaultFldr()

  Dim Fldr As Folder

  Set Fldr = Session.GetDefaultFolder(olFolderInbox)

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

End Sub

Op mijn laptop geeft TestDefaultFldr() Outlook data file|Inbox wat als een verrassing kwam. Ik schreef GetFldrNames(Fldr) om ervoor te zorgen dat de map waarnaar ik had verwezen degene was die ik wilde hebben. Ik had toegang tot de standaard Inbox en vond dat deze leeg was! Winkel "Uitgangsgegevensbestand" werd geleverd met de standaardinstallatie en ik had het genegeerd omdat Outlook een winkel had gemaakt voor elk van mijn e-mailaccounts. Pas nadat ik mijn lege standaardinbox had ontdekt, dacht ik na over hoe Outlook zou weten welke van mijn e-mailaccounts het account was dat ik als standaard zou willen. Van de standaard Outlook-mappen is er geen standaardwaarde of de standaardwaarde bevindt zich in "Gegevensbestand uitvoer". Het is misschien mogelijk om te veranderen welke Inbox de standaard Inbox is, maar ik heb niet onderzocht omdat ik niet zeker weet welke van mijn e-mailaccounts ik de standaard zou maken als ik zou veranderen. Vergeet niet dat al uw agenda-items, taken enzovoort zich in het "Outlook-gegevensbestand" bevinden en zorg ervoor dat u "Outlook.pst" opneemt in uw archieflijst.

De meeste Outlook-objecten hebben de eigenschap Parent . GetFldrNames(Fldr) registreert de naam van de map in een array voordat u probeert toegang te krijgen tot de bovenliggende map. Het voegt loops toe aan het einde van de array totdat het de winkel bereikt. De winkel heeft geen ouder, dus de poging om toegang te krijgen mislukt. De reeks namen in de array wordt omgekeerd en vervolgens teruggestuurd naar de beller. Ik heb Join gebruikt om de reeks namen om te zetten in een reeks die kan worden weergegeven.

3.3 Verwijzen naar een map binnen een toegankelijke winkel

TestFldrChain() laat zien hoe naar elke map in een toegankelijke winkel kan worden verwezen:

Sub TestFldrChain()

  Dim Fldr As Folder

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

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

End Sub    

In TestFldrChain() : A is de naam van een winkel; A2 is de naam van een map binnen A; A21 is de naam van een map binnen A2 en A213 is de naam van een map binnen A21.

Wat gebeurt hier?

Session heeft een eigenschap Folders die een lijst met alle toegankelijke winkels is.

Session.Folders(integer) , die ik in deel 2 van deze zelfstudie heb gebruikt, stelt me in staat om opeenvolgend door de winkels te bladeren wanneer ik hun namen niet weet. Session.Folders("A") geeft me toegang tot een map als ik de naam weet.

Session.Folders("A") is een map en deze heeft ook een eigenschap Folders .

Session.Folders("A").Folders("A2") geven me toegang tot map "A2" in winkel "A".

Ik kan zoveel Folders("x") s koppelen als nodig om een map te bereiken. Als de ketting te lang is voor één regel, kunt u de instructie opsplitsen over meerdere regels zoals ik heb.

Zoek naar de meest geneste map in uw installatie en vervang A, A2, A21 en A213 door de namen van uw winkel en mappen. Verhoog of verlaag indien nodig het aantal mappen in de keten.

Als u TestFldrChain() bijwerkt en uitvoert, wordt het volgende uitgevoerd, behalve dat A, A2 enzovoort zijn vervangen door uw mapnamen:

A|A2|A21|A213 

3.4 Lijst van de namen van elke map binnen elke toegankelijke winkel

In deel 2 werd u getoond hoe u elke toegankelijke winkel en de mappen op het hoogste niveau binnen elke winkel kunt weergeven. Dit omvatte een lus door de winkels en vervolgens een lus voor elke winkel door de mappen. Hierboven hebt u gezien hoe u naar een bekende map kunt verwijzen op elke diepte binnen de hiërarchie van mappen. Dit omvatte het koppelen van zoveel mogelijk Folders("x") als nodig om de map te bereiken.

Ik wil nu elke map, op elke diepte, in elke winkel weergeven. De eenvoudigste coderingstechniek voor het oplossen van dit soort problemen waarbij u ketens van verschillende lengtes moet verplaatsen, is recursie . Als je een serieuze programmeur bent in een andere taal of tool, weet je misschien al wat recursie is. Als je de ambitie hebt om een serieuze programmeur te worden, moet je uiteindelijk recursie begrijpen, maar niet noodzakelijk vandaag. 'Recursie' is een van die concepten die velen in het begin moeilijk te begrijpen zijn. U kunt 'Recursion' in uw favoriete zoekmachine typen en de verschillende pogingen lezen om dit concept uit te leggen. Als alternatief kunt u dit macrowerk accepteren, maar maakt u zich geen zorgen hoe ze werken.

Let op de opmerking in ListStoresAndAllFolders() : deze macro's hebben een verwijzing naar "Microsoft Scripting Runtime" nodig. Klik op Tools op de tabbladbalk boven in het venster van VB Editor en klik vervolgens op Referenties . U krijgt een lijst met alle beschikbare referenties (bibliotheken). Sommige bovenaan zijn al aangevinkt. De rest is in alfabetische volgorde. Blader door de lijst en klik op het vak links van "Microsoft Scripting Runtime" om een vinkje te krijgen. Klik vervolgens op 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

Nadat u ListStoresAndAllFolders hebt uitgevoerd, zal er een nieuw bestand op uw DeskTop staan met de naam "ListStoresAndAllFolders.txt" dat de beloofde lijst met winkels en mappen zal bevatten.

3.5 Een map verplaatsen van de ene bovenliggende map naar de andere

Waarom wil ik naar een map verwijzen? In het volgende deel zal ik je laten zien hoe je toegang krijgt tot e-mails in een map waarnaar wordt verwezen. Hier zal ik je laten zien hoe je een map kunt verplaatsen. Ik heb een map met de naam 'Test' gemaakt in mijn Postvak IN. In TestMoveFolder() heb ik "A" vervangen door de naam van de winkel met mijn Postvak IN. Met TestMoveFolder() is "Test" verplaatst naar "Verwijderde items".

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 Wat u moet onthouden uit dit deel van de tutorial

  • Hoe naar een standaardmap te verwijzen en de mogelijke beperkingen van deze techniek.
  • Hoe naar elke map op elke diepte in een toegankelijke winkel te verwijzen.
  • Hoe de volledige naam van een map waarnaar wordt verwezen, wordt weergegeven.
  • Hoe te verwijzen naar een van de vele, vele beschikbare bibliotheken die functionaliteit bieden die verder gaat dan de standaardset van subroutines en functies.
  • Hoe de naam van elke map binnen elke toegankelijke winkel wordt weergegeven.
  • Hoe een map van de ene bovenliggende map naar de andere te verplaatsen.


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow