Suche…


Einführung

Schließt die Einführung zu den Speichern und Ordnern ab, die in Teil 2 dieses Lernprogramms gestartet wurden

Erwartete Vorkenntnisse : Sie haben Teil 2 dieses Tutorials studiert oder sind bereits mit dessen Inhalten vertraut.

3. 0 Inhalt

  • Wie verweise ich auf jeden zugänglichen Ordner?
  • So erhalten Sie den vollständigen Namen eines referenzierten Ordners.
  • Ein Routinenpaar, das zusammen jeden Ordner in jedem zugänglichen Speicher auflistet.
  • Eine Routine, um einen Ordner von einem übergeordneten Ordner in einen anderen zu verschieben.

3.1 Die Funktion GetFldrNames (), die für einige Demonstrationsmakros benötigt wird

Eine Anzahl der Demonstrationsmakros in diesem Teil erfordert eine Funktion, die ich später erklären werde. Kopieren Sie im Moment einfach GetFldrNames() in ein geeignetes Modul. Ich verwende diese Funktion häufig und verwende sie und andere, die ich in vielen verschiedenen Makros benutze, in einem Modul namens "ModGlobalOutlook". Möglicherweise möchten Sie dasselbe tun. Alternativ können Sie es vorziehen, das Makro mit allen anderen Makros in dieser Lernreihe beizubehalten. Sie können es später verschieben, wenn Sie Ihre Meinung ändern.

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 Verweis auf einen Standardordner

In TestDefaultFldr() setze ich Fldr auf den Standardeingang. Die Konstante olFolderInbox kann durch andere Werte ersetzt werden, die den Zugriff auf die Standardordner ermöglichen. Wenn Sie Set Fldr = Session.GetDefaultFolder( der VB-Editor zeigt eine Dropdown-Liste aller möglichen Werte an.

Sub TestDefaultFldr()

  Dim Fldr As Folder

  Set Fldr = Session.GetDefaultFolder(olFolderInbox)

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

End Sub

Auf meinem Laptop zeigt TestDefaultFldr() die Outlook data file|Inbox TestDefaultFldr() Outlook data file|Inbox die überraschend war. Ich habe GetFldrNames(Fldr) , um sicherzustellen, dass der Ordner, auf den ich verwiesen hatte, derjenige war, den ich wollte. Ich hatte auf den Standard-Posteingang zugegriffen und festgestellt, dass er leer war! Store "Ausgabedatendatei" wurde mit der Standardinstallation geliefert und ich hatte sie ignoriert, da Outlook für jedes meiner E-Mail-Konten einen Store erstellt hatte. Erst als ich meinen leeren Posteingang entdeckt hatte, überlegte ich, wie Outlook herausfinden würde, welches meiner E-Mail-Konten das Konto war, das ich als Standard verwenden wollte. Von den Standard-Outlook-Ordnern gibt es entweder keinen Standardwert oder der Standardwert befindet sich in „Ausgabedatendatei“. Es kann möglich sein, den Posteingang zu ändern, der als Standard-Posteingang fungiert. Ich habe jedoch keine Nachforschungen angestellt, da ich nicht sicher bin, welche meiner E-Mail-Konten ich als Standard festlegen würde, wenn ich Änderungen vorgenommen habe. Denken Sie daran, dass sich alle Ihre Kalenderelemente, Aufgaben usw. in der "Outlook-Datendatei" befinden, und stellen Sie sicher, dass Sie "Outlook.pst" in Ihre Archivliste aufnehmen.

Die meisten Outlook-Objekte haben die Eigenschaft Parent . GetFldrNames(Fldr) zeichnet den Namen des Ordners in einem Array auf, bevor er auf den übergeordneten Ordner zugreifen kann. Das Hinzufügen von Namen am Ende des Arrays erfolgt in einer Schleife, bis es den Speicher erreicht. Der Speicher hat kein übergeordnetes Element, daher schlägt der Versuch fehl, auf das Geschäft zuzugreifen. Die Reihenfolge der Namen im Array wird umgekehrt und an den Anrufer zurückgegeben. Ich habe Join , um das Array von Namen in eine darstellbare Zeichenfolge umzuwandeln.

3.3 Verweis auf einen Ordner in einem zugänglichen Speicher

TestFldrChain() demonstriert, wie auf jeden Ordner in einem zugänglichen Speicher verwiesen wird:

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 ist der Name eines Geschäfts; A2 ist der Name eines Ordners in A; A21 ist der Name eines Ordners in A2 und A213 ist der Name eines Ordners in A21.

Was passiert hier?

Session hat eine Eigenschaft Folders die eine Liste aller zugänglichen Speicher ist.

Session.Folders(integer) , die ich in Teil 2 dieses Tutorials verwendet habe, ermöglicht es mir, die Läden nacheinander zu durchlaufen, wenn ich deren Namen nicht kenne. Session.Folders("A") kann ich auf einen Ordner zugreifen, wenn ich dessen Namen kenne.

Session.Folders("A") ist ein Ordner und hat ebenfalls eine Eigenschaft Folders .

Session.Folders("A").Folders("A2") den Zugriff auf Ordner "A2" im Speicher "A".

Ich kann beliebig viele Folders("x") verketten, um einen Ordner zu erreichen. Wenn die Kette für eine Zeile zu lang ist, können Sie die Anweisung wie ich auf mehrere Zeilen aufteilen.

Suchen Sie nach dem am tiefsten verschachtelten Ordner in Ihrer Installation und ersetzen Sie A, A2, A21 und A213 durch die Namen Ihres Geschäfts und der Ordner. Erhöhen oder verringern Sie die Anzahl der Ordner in der Kette nach Bedarf.

Wenn Sie TestFldrChain() aktualisieren und ausführen, wird Folgendes ausgegeben, mit der Ausnahme, dass A, A2 usw. durch Ihre TestFldrChain() ersetzt wurden:

A|A2|A21|A213 

3.4 Auflisten der Namen aller Ordner in jedem zugänglichen Speicher

In Teil 2 wurde Ihnen gezeigt, wie Sie alle zugänglichen Geschäfte und die Ordner der obersten Ebene in jedem Geschäft auflisten. Dies beinhaltete eine Schleife durch die Speicher und dann eine Schleife für jeden Speicher durch seine Ordner. Oben haben Sie gesehen, wie Sie einen bekannten Ordner in einer beliebigen Tiefe innerhalb der Ordnerhierarchie referenzieren können. Dazu mussten so viele Folders("x") , bis der Ordner erreicht werden kann.

Ich möchte jetzt jeden Ordner in jeder Filiale in jeder Tiefe auflisten. Die einfachste Codierungsmethode zur Lösung dieser Art von Problem, bei der Ketten unterschiedlicher Länge nach unten verschoben werden müssen, ist die Rekursion . Wenn Sie ein seriöser Programmierer in einer anderen Sprache oder einem anderen Tool sind, wissen Sie möglicherweise bereits über Rekursion. Wenn Sie ehrgeizige Programmierer sind, müssen Sie die Rekursion eventuell verstehen, aber nicht unbedingt heute. „Rekursion“ ist eines dieser Konzepte, das viele zunächst schwer fassen können. Sie können "Rekursion" in Ihre bevorzugte Suchmaschine eingeben und die verschiedenen Erklärungsversuche für dieses Konzept lesen. Alternativ können Sie diese Makro-Arbeit akzeptieren, ohne sich um ihre Funktionsweise zu kümmern.

Beachten Sie den Kommentar in ListStoresAndAllFolders() : Diese Makros benötigen einen Verweis auf "Microsoft Scripting Runtime". Klicken Sie in der Registerkartenleiste oben im VB-Editor-Fenster auf Werkzeuge und dann auf Verweise . Sie erhalten eine Liste aller verfügbaren Referenzen (Bibliotheken). Einige oben werden bereits angekreuzt. Der Rest ist in alphabetischer Reihenfolge. Scrollen Sie durch die Liste und klicken Sie auf das Kästchen links neben "Microsoft Scripting Runtime", um einen Haken zu setzen. Klicken Sie dann auf 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

Nachdem Sie ListStoresAndAllFolders , befindet sich auf Ihrem DeskTop eine neue Datei mit dem Namen "ListStoresAndAllFolders.txt", die die versprochene Liste der Geschäfte und Ordner enthält.

3.5 Verschieben eines Ordners von einem übergeordneten Ordner in einen anderen

Warum möchte ich einen Ordner referenzieren? Im nächsten Teil werde ich Ihnen zeigen, wie Sie auf E-Mails in einem referenzierten Ordner zugreifen können. Hier zeige ich Ihnen, wie Sie einen Ordner verschieben. Ich habe in meinem Posteingang einen Ordner mit dem Namen "Test" erstellt. In TestMoveFolder() ich "A" durch den Namen des Geschäfts mit meinem Posteingang ersetzt. Beim Ausführen von TestMoveFolder() "Test" in "Gelöschte Objekte" verschoben.

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 Was Sie in diesem Teil des Tutorials beachten sollten

  • Referenzieren eines Standardordners und mögliche Einschränkungen dieser Technik.
  • So referenzieren Sie einen beliebigen Ordner in jeder Tiefe in einem zugänglichen Speicher.
  • So zeigen Sie den vollständigen Namen eines referenzierten Ordners an.
  • Wie verweise ich auf eine der vielen verfügbaren Bibliotheken, die Funktionalität bieten, die über den Standardsatz von Unterprogrammen und Funktionen hinausgeht
  • Anzeigen des Namens jedes Ordners in jedem zugänglichen Speicher
  • So verschieben Sie einen Ordner von einem übergeordneten Ordner in einen anderen.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow