outlook-vba
Inledning Del 3: Butiker och alla deras mappar
Sök…
Introduktion
Slutför introduktionen till butiker och mappar som startades i del 2 av denna handledning
Förväntad förkunskaper : Du har studerat del 2 av denna självstudie eller känner redan till innehållet.
3. 0 Innehåll
- Hur man refererar till en tillgänglig mapp.
- Hur du får fullständigt namn på en referensmapp.
- Ett par rutiner som tillsammans listar varje mapp i varje tillgänglig butik.
- En rutin för att flytta en mapp från en överordnad mapp till en annan.
3.1 Funktion GetFldrNames () som behövs för flera av demonstrationsmakronen
Ett antal demonstrationsmakroer inom denna del kräver en funktion som jag kommer att förklara senare. För tillfället, kopiera bara GetFldrNames()
till en lämplig modul. Jag använder den här funktionen ofta och behåller den, och andra liknande som jag använder i många olika makron, i en modul med namnet “ModGlobalOutlook”. Du kanske vill göra samma sak. Alternativt kanske du föredrar att behålla makro med alla andra makron i denna tutorial-serie; Du kan flytta den senare om du ändrar dig.
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 Referera till en standardmapp
I TestDefaultFldr()
jag Fldr
till standardinkorgen. Den konstanta olFolderInbox
kan ersättas av andra värden som ger åtkomst till någon av standardmapparna. Om du skriver Set Fldr = Session.GetDefaultFolder(
kommer VB-redigeraren att visa en listruta med alla möjliga värden.
Sub TestDefaultFldr()
Dim Fldr As Folder
Set Fldr = Session.GetDefaultFolder(olFolderInbox)
Debug.Print Join(GetFldrNames(Fldr), "|")
End Sub
På min bärbara TestDefaultFldr()
visar TestDefaultFldr()
Outlook data file|Inbox
som kom som en överraskning. Jag skrev GetFldrNames(Fldr)
att se till att mappen jag refererade till var den jag ville ha. Jag hade öppnat standardinkorgen och tyckte att den var tom! Butiken "Outputdatafil" kom med standardinstallationen och jag hade ignorerat den sedan Outlook skapat en butik för vart och ett av mina e-postkonton. Det var först efter att jag upptäckte min tomma standardinkorg som jag tänkte på hur Outlook skulle veta vilket av mina e-postkonton som var det konto jag vill ha som standard. Av de vanliga Outlook-mapparna finns antingen ingen standard eller standard är inom "Outputdatafil". Det kan vara möjligt att ändra vilken inkorg som är standardinkorgen men jag har inte undersökt eftersom jag inte är säker på vilka av mina e-postkonton jag skulle göra som standard om jag ändrade. Kom bara ihåg att alla dina kalenderobjekt, uppgifter och så vidare finns inom "Outlook-datafil" och se till att du inkluderar "Outlook.pst" i din arkivlista.
De flesta Outlook-objekt har egenskapen Parent
. GetFldrNames(Fldr)
registrerar namnet på mappen i en matris innan du försöker få åtkomst till dess överordnade. Den slingor lägger till namn i slutet av matrisen tills den når butiken. Butiken har inte en förälder så försöket att komma åt den misslyckas. Namnssekvensen i matrisen omvänds och returneras sedan till den som ringer. Jag har använt Join
att förvandla matrisen med namn till en visningsbar sträng.
3.3 Referera till en mapp i alla tillgängliga butiker
TestFldrChain()
visar hur man refererar till en mapp i en tillgänglig butik:
Sub TestFldrChain()
Dim Fldr As Folder
Set Fldr = Session.Folders("A").Folders("A2"). _
Folders("A21").Folders("A213")
Debug.Print Join(GetFldrNames(Fldr), "|")
End Sub
I TestFldrChain()
: A är namnet på en butik; A2 är namnet på en mapp inom A; A21 är namnet på en mapp inom A2 och A213 är namnet på en mapp inom A21.
Vad är det som händer här?
Session
har en egenskap Folders
som är en lista över alla tillgängliga butiker.
Session.Folders(integer)
, som jag använde i del 2 av denna självstudie, tillåter mig att gå igenom butikerna i följd när jag inte vet deras namn. Session.Folders("A")
tillåter mig åtkomst till en mapp när jag vet dess namn.
Session.Folders("A")
är en mapp och den har också en egenskap Folders
.
Session.Folders("A").Folders("A2")
ger mig tillgång till mappen "A2" i butik "A".
Jag kan kedja så många Folders("x")
som behövs för att nå någon mapp. Om kedjan är för lång för en rad kan du dela uttalandet över flera rader som jag har.
Leta efter den djupt kapslade mappen i din installation och ersätt A, A2, A21 och A213 med namnet på din butik och mappar. Öka eller minska antalet mappar i kedjan vid behov.
Om du uppdaterar och kör TestFldrChain()
kommer det att matas ut följande förutom att A, A2 och så vidare har ersatts av dina mappnamn:
A|A2|A21|A213
3.4 Lista namnen på varje mapp i varje tillgänglig butik
I del 2 visades du hur du listar alla tillgängliga butiker och toppnivåmappar i varje butik. Detta involverade en slinga genom butikerna och sedan en slinga för varje butik genom dess mappar. Ovan har du sett hur du refererar till en känd mapp på vilket djup som helst inom hierarkin av mappar. Det handlade om att kedja ihop så många Folders("x")
som behövs för att nå mappen.
Jag vill nu lista varje mapp, på vilket djup som helst, i varje butik. Den enklaste kodningstekniken för att lösa den här typen av problem där du måste flytta ner kedjor med olika längder är rekursion . Om du är en seriös programmerare på ett annat språk eller ett verktyg kanske du redan känner till rekursion. Om du har ambitioner att vara en seriös programmerare måste du förstå rekursion så småningom men inte nödvändigtvis i dag. ”Rekursion” är ett av de begrepp som många har svårt att förstå först. Du kan skriva "Rekursion" i din favorit sökmotor och läsa de olika försöken att förklara detta koncept. Alternativt kan du acceptera det här makroarbetet men oroa dig inte hur de fungerar.
Notera kommentaren i ListStoresAndAllFolders()
: dessa makron behöver en hänvisning till "Microsoft Scripting Runtime". Klicka på Verktyg i flikfältet högst upp i VB Editor-fönstret och klicka sedan på Referenser . Du får en lista över alla tillgängliga referenser (bibliotek). Några överst kommer redan att kryssas av. Återstoden är i alfabetisk ordning. Rulla nedför listan och klicka på rutan till vänster om "Microsoft Scripting Runtime" för att få en kryssning. Klicka sedan på 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
När du har kört ListStoresAndAllFolders
kommer det att finnas en ny fil på din DeskTop med namnet “ListStoresAndAllFolders.txt” som kommer att innehålla den utlovade listan med butiker och mappar.
3.5 Flytta en mapp från en överordnad mapp till en annan
Varför vill jag referera till en mapp? I nästa del kommer jag att visa dig hur du får åtkomst till e-postmeddelanden i en referensmapp. Här kommer jag att visa dig hur du flyttar en mapp. Jag skapade en mapp med namnet “Test” i min inkorg. I TestMoveFolder()
ersatte jag "A" med namnet på butiken som innehåller min inkorg. Att köra TestMoveFolder()
flyttade “Test” till “Raderade objekt”.
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 Vad du bör komma ihåg från den här delen av lektionen
- Hur man refererar till en standardmapp och de möjliga begränsningarna för denna teknik.
- Hur man refererar till en enda mapp på vilket djup som helst i en tillgänglig butik.
- Hur du visar det fullständiga namnet på en referensmapp.
- Hur man refererar till ett av de många, många tillgängliga biblioteken som ger funktionalitet utöver standarduppsättningen av subroutiner och funktioner.
- Hur man visar namnet på varje mapp i varje tillgänglig butik.
- Hur man flyttar en mapp från en överordnad mapp till en annan.