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.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow