outlook-vba
Einführung Teil 3: Speichert alle Ordner
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.