Ricerca…


introduzione

Completa l'introduzione ai negozi e alle cartelle iniziati nella parte 2 di questo tutorial

Conoscenza precedente prevista : hai studiato parte 2 di questo tutorial o conosci già i suoi contenuti.

3. 0 Contenuti

  • Come fare riferimento a qualsiasi cartella accessibile.
  • Come ottenere il nome completo di una cartella di riferimento.
  • Un paio di routine che insieme elenceranno tutte le cartelle all'interno di ogni negozio accessibile.
  • Una routine per spostare una cartella da una cartella principale a un'altra.

3.1 Funzione GetFldrNames () che è necessaria per molte delle macro dimostrative

Un certo numero di macro dimostrative all'interno di questa parte richiede una funzione che spiegherò più avanti. Per il momento, copia semplicemente GetFldrNames() in un modulo adatto. Uso frequentemente questa funzione e la manterrò, e altre simili a quelle che uso in molte diverse macro, in un modulo chiamato "ModGlobalOutlook". Ti potrebbe piacere fare lo stesso. In alternativa, potresti preferire di mantenere la macro con tutte le altre macro all'interno di questa serie di tutorial; puoi spostarlo in seguito se cambi idea.

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 Riferimento a una cartella predefinita

In TestDefaultFldr() ho impostato Fldr sulla Posta in arrivo predefinita. La costante olFolderInbox può essere sostituita da altri valori che danno accesso a qualsiasi cartella predefinita. Se si digita Set Fldr = Session.GetDefaultFolder( , l'editor VB visualizzerà un elenco a discesa di tutti i valori possibili.

Sub TestDefaultFldr()

  Dim Fldr As Folder

  Set Fldr = Session.GetDefaultFolder(olFolderInbox)

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

End Sub

Sul mio portatile, TestDefaultFldr() visualizza il Outlook data file|Inbox che è stato una sorpresa. Ho scritto GetFldrNames(Fldr) per assicurarmi che la cartella a cui avevo fatto riferimento fosse quella che volevo. Ho avuto accesso alla posta in arrivo predefinita e ho scoperto che era vuoto! Memorizza "File di dati di output" fornito con l'installazione predefinita e l'ho ignorato poiché Outlook aveva creato un negozio per ciascuno dei miei account di posta elettronica. È stato solo dopo aver scoperto la mia casella di posta in arrivo predefinita che ho pensato a come Outlook avrebbe saputo quale dei miei account e-mail era l'account che avrei voluto come predefinito. Delle cartelle standard di Outlook, non esiste alcun valore predefinito o il valore predefinito è in "File dati di output". Potrebbe essere possibile cambiare quale Posta in arrivo è la Posta in arrivo predefinita ma non ho indagato perché non sono sicuro di quale dei miei account di posta elettronica farei il default se cambiassi. Ricorda che tutti gli elementi del calendario, le attività e così via si trovano all'interno di "file di dati di Outlook" e assicurati di includere "Outlook.pst" nell'elenco degli archivi.

La maggior parte degli oggetti di Outlook ha la proprietà Parent . GetFldrNames(Fldr) registra il nome della cartella in un array prima di provare ad accedere al suo genitore. Si loop aggiungendo nomi alla fine della matrice fino a quando non raggiunge lo store. Il negozio non ha un genitore quindi il tentativo di accesso fallisce. La sequenza di nomi nell'array viene invertita e quindi restituita al chiamante. Ho usato Join per trasformare la matrice di nomi in una stringa visualizzabile.

3.3 Riferimento a qualsiasi cartella all'interno di qualsiasi negozio accessibile

TestFldrChain() dimostra come fare riferimento a qualsiasi cartella all'interno di qualsiasi archivio accessibile:

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 è il nome di un negozio; A2 è il nome di una cartella all'interno di A; A21 è il nome di una cartella all'interno di A2 e A213 è il nome di una cartella all'interno di A21.

Cosa sta succedendo qui?

Session ha una proprietà Folders che è una lista di tutti i negozi accessibili.

Session.Folders(integer) , che ho utilizzato nella parte 2 di questo tutorial, mi consente di scorrere i negozi in sequenza quando non conosco i loro nomi. Session.Folders("A") mi consente di accedere a una cartella quando conosco il suo nome.

Session.Folders("A") è una cartella e anch'essa ha una proprietà Folders .

Session.Folders("A").Folders("A2") mi danno accesso alla cartella "A2" nel negozio "A".

Posso incatenare tante Folders("x") se necessario per raggiungere qualsiasi cartella. Se la catena è troppo lunga per una linea, puoi dividere l'istruzione su più righe come ho fatto io.

Cerca la cartella più profondamente annidata all'interno dell'installazione e sostituisci A, A2, A21 e A213 con i nomi del tuo negozio e delle tue cartelle. Aumentare o diminuire il numero di cartelle nella catena secondo necessità.

Se aggiorni ed esegui TestFldrChain() , verrà TestFldrChain() quanto segue ad eccezione del fatto che A, A2 e così via saranno stati sostituiti dai nomi delle tue cartelle:

A|A2|A21|A213 

3.4 Elenco dei nomi di ogni cartella in ogni negozio accessibile

Nella parte 2, ti è stato mostrato come elencare ogni archivio accessibile e le cartelle di livello superiore all'interno di ogni negozio. Ciò comportava un ciclo attraverso i negozi e quindi un ciclo per ogni negozio attraverso le sue cartelle. Sopra hai visto come fare riferimento a una cartella conosciuta a qualsiasi profondità all'interno della gerarchia delle cartelle. Ciò ha comportato il concatenamento di tutte le Folders("x") necessarie per raggiungere la cartella.

Ora voglio elencare ogni cartella, a qualsiasi profondità, all'interno di ogni negozio. La tecnica di codifica più semplice per risolvere questo tipo di problema in cui è necessario spostare catene di lunghezze diverse è la ricorsione . Se sei un programmatore serio in un'altra lingua o strumento, potresti già conoscere la ricorsione. Se hai ambizioni di essere un programmatore serio, alla fine dovrai capire la ricorsione, ma non necessariamente oggi. "La ricorsione" è uno di quei concetti che molti trovano difficile da afferrare all'inizio. Puoi digitare "Ricorsione" nel tuo motore di ricerca preferito e leggere i vari tentativi di spiegare questo concetto. In alternativa, puoi accettare questi macro lavori, ma non preoccuparti di come funzionano.

Nota il commento in ListStoresAndAllFolders() : queste macro richiedono un riferimento a "Microsoft Scripting Runtime". Fai clic su Strumenti nella barra delle schede nella parte superiore della finestra di VB Editor, quindi fai clic su Riferimenti . Otterrai un elenco di tutti i riferimenti disponibili (librerie). Alcuni in cima saranno già spuntati. Il resto è in ordine alfabetico. Scorri l'elenco e fai clic sulla casella a sinistra di "Microsoft Scripting Runtime" per ottenere un segno di spunta. Quindi fare clic su 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

Dopo aver eseguito ListStoresAndAllFolders , sul tuo DeskTop sarà presente un nuovo file denominato "ListStoresAndAllFolders.txt" che conterrà l'elenco promesso di negozi e cartelle.

3.5 Spostamento di una cartella da una cartella principale a un'altra

Perché voglio fare riferimento a una cartella? Nella parte successiva ti mostrerò come accedere alle e-mail all'interno di una cartella di riferimento. Qui ti mostrerò come spostare una cartella. Ho creato una cartella denominata "Test" nella mia Posta in arrivo. In TestMoveFolder() , ho sostituito "A" con il nome del negozio che contiene la mia casella di posta. L'esecuzione di TestMoveFolder() spostato "Test" su "Elementi eliminati".

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 Cosa dovresti ricordare da questa parte del tutorial

  • Come fare riferimento a una cartella predefinita e ai possibili limiti di questa tecnica.
  • Come fare riferimento a qualsiasi singola cartella a qualsiasi profondità all'interno di qualsiasi negozio accessibile.
  • Come visualizzare il nome completo di una cartella di riferimento.
  • Come fare riferimento a una delle tante e numerose librerie disponibili che forniscono funzionalità oltre al set predefinito di subroutine e funzioni.
  • Come visualizzare il nome di ogni cartella in ogni negozio accessibile.
  • Come spostare una cartella da una cartella principale a un'altra.


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow