outlook-vba
Introducción Parte 3: Tiendas y todas sus carpetas.
Buscar..
Introducción
Completa la introducción a las tiendas y carpetas iniciada en la parte 2 de este tutorial.
Conocimiento previo esperado : usted ha estudiado la parte 2 de este tutorial o ya está familiarizado con su contenido.
3. 0 contenidos
- Cómo hacer referencia a cualquier carpeta accesible.
- Cómo obtener el nombre completo de una carpeta de referencia.
- Un par de rutinas que juntas enumerarán cada carpeta dentro de cada tienda accesible.
- Una rutina para mover una carpeta de una carpeta principal a otra.
3.1 Función GetFldrNames () que se necesita para varias de las macros de demostración
Algunas de las macros de demostración dentro de esta parte requieren una función que explicaré más adelante. Por el momento, simplemente copie GetFldrNames()
en un módulo adecuado. Utilizo esta función con frecuencia y la guardo, y otra similar, que uso en muchas macros diferentes, en un módulo llamado "ModGlobalOutlook". Puede que quieras hacer lo mismo. Alternativamente, puede preferir mantener la macro con todas las demás macros dentro de esta serie de tutoriales; Puedes moverlo más tarde si cambias de opinión.
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 Referencia a una carpeta por defecto
En TestDefaultFldr()
configuré Fldr
en la Bandeja de entrada predeterminada. La constante olFolderInbox
se puede reemplazar por otros valores que dan acceso a cualquiera de las carpetas predeterminadas. Si escribe Set Fldr = Session.GetDefaultFolder(
, el editor de VB mostrará una lista desplegable de todos los valores posibles.
Sub TestDefaultFldr()
Dim Fldr As Folder
Set Fldr = Session.GetDefaultFolder(olFolderInbox)
Debug.Print Join(GetFldrNames(Fldr), "|")
End Sub
En mi computadora portátil, TestDefaultFldr()
muestra Outlook data file|Inbox
que fue una sorpresa. Escribí GetFldrNames(Fldr)
para asegurarme de que la carpeta a la que hacía referencia era la que quería. ¡Había accedido a la bandeja de entrada predeterminada y encontré que estaba vacía! El "archivo de datos de salida" de la tienda vino con la instalación predeterminada y lo había ignorado desde que Outlook había creado una tienda para cada una de mis cuentas de correo electrónico. Solo después de descubrir mi Bandeja de entrada predeterminada vacía, pensé en cómo Outlook sabría cuál de mis cuentas de correo electrónico era la cuenta que querría como predeterminada. De las carpetas estándar de Outlook, no hay un valor predeterminado o el valor predeterminado está dentro de "Archivo de datos de salida". Puede ser posible cambiar qué Bandeja de entrada es la Bandeja de entrada predeterminada, pero no he investigado porque no estoy seguro de cuál de mis cuentas de correo electrónico haría la predeterminada si cambiara. Solo recuerde que todos los elementos de su calendario, tareas, etc. están dentro del "archivo de datos de Outlook" y asegúrese de incluir "Outlook.pst" en su lista de archivos.
La mayoría de los objetos de Outlook tienen la propiedad Parent
. GetFldrNames(Fldr)
registra el nombre de la carpeta en una matriz antes de intentar acceder a su padre. Hace un bucle para agregar nombres al final de la matriz hasta que llega a la tienda. La tienda no tiene un padre, por lo que el intento de acceder falla. La secuencia de nombres en la matriz se invierte y luego se devuelve a la persona que llama. He usado Join
para convertir el conjunto de nombres en una cadena visualizable.
3.3 Referencia a cualquier carpeta dentro de cualquier tienda accesible
TestFldrChain()
muestra cómo hacer referencia a cualquier carpeta dentro de cualquier tienda accesible:
Sub TestFldrChain()
Dim Fldr As Folder
Set Fldr = Session.Folders("A").Folders("A2"). _
Folders("A21").Folders("A213")
Debug.Print Join(GetFldrNames(Fldr), "|")
End Sub
En TestFldrChain()
: A es el nombre de una tienda; A2 es el nombre de una carpeta dentro de A; A21 es el nombre de una carpeta dentro de A2 y A213 es el nombre de una carpeta dentro de A21.
¿Que está sucediendo aquí?
Session
tiene una propiedad Folders
que es una lista de todas las tiendas accesibles.
Session.Folders(integer)
, que usé en la Parte 2 de este tutorial, me permite recorrer las tiendas en secuencia cuando no sé sus nombres. Session.Folders("A")
me permite acceder a una carpeta cuando sé su nombre.
Session.Folders("A")
es una carpeta y también tiene una propiedad Folders
.
Session.Folders("A").Folders("A2")
me dan acceso a la carpeta "A2" dentro de la tienda "A".
Puedo encadenar tantas Folders("x")
como sea necesario para llegar a cualquier carpeta. Si la cadena es demasiado larga para una línea, puede dividir la declaración en varias líneas como lo he hecho yo.
Busque la carpeta más anidada dentro de su instalación y reemplace A, A2, A21 y A213 por los nombres de su tienda y carpetas. Aumente o disminuya el número de carpetas en la cadena según sea necesario.
Si actualiza y ejecuta TestFldrChain()
, se mostrará lo siguiente, excepto que A, A2, etc., serán reemplazados por los nombres de sus carpetas:
A|A2|A21|A213
3.4 Listado de los nombres de cada carpeta dentro de cada tienda accesible
En la Parte 2, se le mostró cómo enumerar cada tienda accesible y las carpetas de nivel superior dentro de cada tienda. Esto implicó un bucle a través de las tiendas y luego un bucle para cada tienda a través de sus carpetas. Anteriormente, ha visto cómo hacer referencia a una carpeta conocida a cualquier profundidad dentro de la jerarquía de carpetas. Esto implicó encadenar tantas Folders("x")
como sea necesario para llegar a la carpeta.
Ahora quiero enumerar cada carpeta, a cualquier profundidad, dentro de cada tienda. La técnica de codificación más fácil para resolver este tipo de problema en el que debe bajar cadenas de longitudes variables es la recursión . Si usted es un programador serio en otro lenguaje o herramienta, es posible que ya sepa sobre la recursión. Si tiene ambiciones de ser un programador serio, necesitará comprender la recursión eventualmente, pero no necesariamente hoy. La "recursión" es uno de esos conceptos que muchos encuentran difíciles de entender al principio. Puede escribir "Recursión" en su motor de búsqueda favorito y leer los distintos intentos de explicar este concepto. Alternativamente, puede aceptar estos trabajos de macro, pero no preocuparse de cómo funcionan.
Tenga en cuenta el comentario en ListStoresAndAllFolders()
: estas macros necesitan una referencia a "Microsoft Scripting Runtime". Haga clic en Herramientas en la barra de pestañas en la parte superior de la ventana Editor VB y luego haga clic en Referencias . Obtendrá una lista de todas las referencias disponibles (bibliotecas). Algunos en la parte superior ya estarán marcados. El resto está en orden alfabético. Desplácese hacia abajo en la lista y haga clic en el cuadro a la izquierda de "Microsoft Scripting Runtime" para obtener una marca. A continuación, haga clic en Aceptar
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
Después de ejecutar ListStoresAndAllFolders
, habrá un nuevo archivo en su DeskTop llamado "ListStoresAndAllFolders.txt" que contendrá la lista prometida de tiendas y carpetas.
3.5 Mover una carpeta de una carpeta principal a otra
¿Por qué quiero hacer referencia a una carpeta? En la siguiente parte, le mostraré cómo acceder a los correos electrónicos dentro de una carpeta referenciada. Aquí te mostraré cómo mover una carpeta. Creé una carpeta llamada "Prueba" dentro de mi bandeja de entrada. En TestMoveFolder()
, reemplacé "A" con el nombre de la tienda que contiene mi Bandeja de entrada. La ejecución de TestMoveFolder()
movió "Prueba" a "Elementos eliminados".
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 Lo que debes recordar de esta parte del tutorial
- Cómo hacer referencia a una carpeta predeterminada y las posibles limitaciones de esta técnica.
- Cómo hacer referencia a cualquier carpeta individual a cualquier profundidad dentro de cualquier tienda accesible.
- Cómo mostrar el nombre completo de una carpeta referenciada.
- Cómo hacer referencia a una de las muchas, muchas bibliotecas disponibles que proporcionan funcionalidad más allá del conjunto predeterminado de subrutinas y funciones.
- Cómo mostrar el nombre de cada carpeta dentro de cada tienda accesible.
- Cómo mover una carpeta de una carpeta padre a otra.