outlook-vba
Introduzione Parte 3: archivi e tutte le loro cartelle
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.