outlook-vba
Introduction Partie 3: Magasins et tous leurs dossiers
Recherche…
Introduction
Termine la présentation des magasins et des dossiers lancés dans la partie 2 de ce didacticiel
Connaissances préalables attendues : Vous avez étudié la partie 2 de ce tutoriel ou connaissez déjà son contenu.
3. 0 Contenu
- Comment référencer un dossier accessible.
- Comment obtenir le nom complet d'un dossier référencé.
- Une paire de routines qui répertorieront tous les dossiers de chaque magasin accessible.
- Une routine pour déplacer un dossier d'un dossier parent vers un autre.
3.1 Fonction GetFldrNames () nécessaire pour plusieurs macros de démonstration
Un certain nombre de macros de démonstration dans cette partie nécessitent une fonction que je vais expliquer plus tard. Pour le moment, veuillez simplement copier GetFldrNames()
sur un module approprié. J'utilise fréquemment cette fonction et la garde, ainsi que d'autres fonctions similaires, que j'utilise dans de nombreuses macros différentes, dans un module nommé «ModGlobalOutlook». Vous pourriez aimer faire la même chose. Vous pouvez également préférer conserver la macro avec toutes les autres macros de cette série de didacticiels. vous pouvez le déplacer plus tard si vous changez d'avis.
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 Référencement d'un dossier par défaut
Dans TestDefaultFldr()
je définis Fldr
sur la boîte de réception par défaut. La constante olFolderInbox
peut être remplacée par d'autres valeurs donnant accès à l'un des dossiers par défaut. Si vous tapez Set Fldr = Session.GetDefaultFolder(
l'éditeur VB affichera une liste déroulante de toutes les valeurs possibles).
Sub TestDefaultFldr()
Dim Fldr As Folder
Set Fldr = Session.GetDefaultFolder(olFolderInbox)
Debug.Print Join(GetFldrNames(Fldr), "|")
End Sub
Sur mon ordinateur portable, TestDefaultFldr()
affiche Outlook data file|Inbox
qui a été une surprise. J'ai écrit GetFldrNames(Fldr)
pour m'assurer que le dossier que j'avais référencé était celui que je voulais. J'avais accédé à la boîte de réception par défaut et j'ai trouvé que c'était vide! Store "Fichier de données de sortie" est venu avec l'installation par défaut et je l'avais ignoré car Outlook avait créé un magasin pour chacun de mes comptes de messagerie. Ce n’est qu’après avoir découvert ma boîte de réception vide par défaut que je pensais à la manière dont Outlook connaîtrait le compte dont je souhaiterais avoir le compte par défaut. Parmi les dossiers Outlook standard, il n'y a pas de valeur par défaut ou la valeur par défaut se trouve dans «Fichier de données de sortie». Il est peut-être possible de modifier la boîte de réception par défaut, mais je n'ai pas enquêté, car je ne suis pas sûr de celui de mes comptes de messagerie que je modifierais par défaut. Rappelez-vous simplement que tous vos éléments de calendrier, vos tâches, etc., se trouvent dans le «fichier de données Outlook» et assurez-vous d'inclure «Outlook.pst» dans votre liste d'archives.
La plupart des objets Outlook ont la propriété Parent
. GetFldrNames(Fldr)
enregistre le nom du dossier dans un tableau avant d'essayer d'accéder à son parent. Il boucle des noms en ajoutant des noms à la fin du tableau jusqu'à ce qu'il atteigne le magasin. Le magasin n'a pas de parent et la tentative d'accès à celui-ci échoue. La séquence de noms dans le tableau est inversée, puis renvoyée à l'appelant. J'ai utilisé Join
pour transformer le tableau de noms en une chaîne affichable.
3.3 Référencement d'un dossier dans un magasin accessible
TestFldrChain()
montre comment référencer un dossier dans un magasin accessible:
Sub TestFldrChain()
Dim Fldr As Folder
Set Fldr = Session.Folders("A").Folders("A2"). _
Folders("A21").Folders("A213")
Debug.Print Join(GetFldrNames(Fldr), "|")
End Sub
Dans TestFldrChain()
: A est le nom d’un magasin; A2 est le nom d'un dossier dans A; A21 est le nom d'un dossier dans A2 et A213 est le nom d'un dossier dans A21.
Que se passe-t-il ici?
Session
a une propriété Folders
qui est une liste de tous les magasins accessibles.
Session.Folders(integer)
, que j'ai utilisé dans la partie 2 de ce tutoriel, me permet de parcourir les magasins en séquence lorsque je ne connais pas leurs noms. Session.Folders("A")
me permet d'accéder à un dossier lorsque je connais son nom.
Session.Folders("A")
est un dossier et possède également une propriété Folders
.
Session.Folders("A").Folders("A2")
me donnent accès au dossier "A2" dans le magasin "A".
Je peux enchaîner autant de Folders("x")
s que nécessaire pour atteindre un dossier. Si la chaîne est trop longue pour une ligne, vous pouvez diviser la déclaration en plusieurs lignes.
Recherchez le dossier le plus imbriqué dans votre installation et remplacez A, A2, A21 et A213 par les noms de votre magasin et de vos dossiers. Augmentez ou diminuez le nombre de dossiers dans la chaîne si nécessaire.
Si vous mettez à jour et exécutez TestFldrChain()
, les résultats suivants seront TestFldrChain()
, sauf que A, A2 et ainsi de suite auront été remplacés par les noms de vos dossiers:
A|A2|A21|A213
3.4 Liste des noms de chaque dossier dans chaque magasin accessible
Dans la deuxième partie, il vous a été montré comment répertorier chaque magasin accessible et les dossiers de niveau supérieur dans chaque magasin. Cela impliquait une boucle dans les magasins, puis une boucle pour chaque magasin via ses dossiers. Ci-dessus, vous avez vu comment référencer un dossier connu à n'importe quelle profondeur dans la hiérarchie des dossiers. Cela impliquait de chaîner autant de Folders("x")
s que nécessaire pour atteindre le dossier.
Je souhaite maintenant répertorier chaque dossier, à n'importe quelle profondeur, dans chaque magasin. La technique de codage la plus simple pour résoudre ce type de problème lorsque vous devez abaisser des chaînes de différentes longueurs est la récursivité . Si vous êtes un programmeur sérieux dans un autre langage ou outil, vous connaissez peut-être déjà la récursivité. Si vous avez l'ambition d'être un programmeur sérieux, vous devrez comprendre la récursivité à terme, mais pas nécessairement aujourd'hui. La «récursivité» est l’un de ces concepts que beaucoup trouvent difficile à saisir au début. Vous pouvez taper «Récursivité» dans votre moteur de recherche préféré et lire les différentes tentatives d’explication de ce concept. Alternativement, vous pouvez accepter ces travaux macro mais ne vous inquiétez pas comment ils fonctionnent.
Notez le commentaire dans ListStoresAndAllFolders()
: ces macros nécessitent une référence à «Microsoft Scripting Runtime». Cliquez sur Outils dans la barre d'onglets située en haut de la fenêtre de l'éditeur VB, puis cliquez sur Références . Vous obtiendrez une liste de toutes les références disponibles (bibliothèques). Certains au sommet seront déjà cochés. Les autres sont en ordre alphabétique. Faites défiler la liste et cliquez sur la case à gauche de «Microsoft Scripting Runtime» pour obtenir une coche. Puis cliquez sur 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
Après avoir exécuté ListStoresAndAllFolders
, il y aura un nouveau fichier sur votre DeskTop nommé «ListStoresAndAllFolders.txt» qui contiendra la liste promise des magasins et des dossiers.
3.5 Déplacement d'un dossier d'un dossier parent vers un autre
Pourquoi est-ce que je veux référencer un dossier? Dans la partie suivante, je vais vous montrer comment accéder aux e-mails dans un dossier référencé. Ici, je vais vous montrer comment déplacer un dossier. J'ai créé un dossier nommé «Test» dans ma boîte de réception. Dans TestMoveFolder()
, j'ai remplacé «A» par le nom du magasin contenant ma boîte de réception. L'exécution de TestMoveFolder()
déplacé «Test» vers «Éléments supprimés».
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 Ce que vous devez retenir de cette partie du tutoriel
- Comment référencer un dossier par défaut et les limitations possibles de cette technique.
- Comment référencer un dossier unique à n'importe quelle profondeur dans un magasin accessible.
- Comment afficher le nom complet d'un dossier référencé.
- Comment référencer l'une des nombreuses bibliothèques disponibles qui fournissent des fonctionnalités au-delà de l'ensemble de sous-programmes et de fonctions par défaut.
- Comment afficher le nom de chaque dossier dans chaque magasin accessible.
- Comment déplacer un dossier d'un dossier parent vers un autre.