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.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow