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.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow