outlook-vba
Introductie Deel 3: Stores en al hun mappen
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.