En un artículo pasado creamos una macro para listar los archivos de una carpeta y colocar sus nombres en las celdas de una columna de Excel. Sin embargo es posible mejorar dicha macro para incluir todos los archivos contenidos en las subcarpetas y eso será precisamente lo que haremos en esta ocasión.
Archivos de carpeta y subcarpetas
Como ejemplo utilizaremos una estructura de archivos como la siguiente:
He colocado la carpeta principal directamente en la unidad C: de mi equipo de manera que la ruta para dicha carpeta será C:\Carpeta.
La carpeta principal contiene 5 archivos y 2 subcarpetas. Cada una de las subcarpetas contiene 5 archivos a la vez por lo que en total tenemos 15 archivos entre la carpeta principal y las subcarpetas. Nuestro objetivo será crear una macro para listar todos los archivos tanto de la carpeta principal como de sus subcarpetas.
El objeto FileSystemObject
El objeto FilsSystemObject es de gran utilidad para tener acceso al sistema de archivos de cualquier equipo. Este objeto nos permite manipular archivos, carpetas, sus rutas de acceso e inclusive podemos obtener información del sistema de archivos. Para crear este tipo de objeto en VBA utilizamos la siguiente instrucción:
Set fs = CreateObject("Scripting.FileSystemObject")
Con esta instrucción habremos creado un objeto FileSystemObject el cual podremos acceder a través de la variable fs. A lo largo del código de nuestra macro utilizaré algunos métodos del objeto FileSystemObject y para cada uno daré una breve explicación que te permita comprender su funcionamiento.
Macro para listar archivos de carpetas y subcarpetas
A continuación se encuentra el código de la macro que crea un listado de los archivos contenidos en la carpeta y subcarpetas.
Sub Mostrar_Archivos(ruta) 'Sección 1: Declaración de variables y objetos Dim fs, carpeta, archivo, subcarpeta As Object Set fs = CreateObject("Scripting.FileSystemObject") 'Sección 2: Ajustes necesarios a ruta If ruta = "" Then Exit Sub ElseIf Right(ruta, 1) <> "" Then ruta = ruta & "" End If 'Sección 3: Objeto Folder de la ruta indicada On Error GoTo ErrHandler Set carpeta = fs.GetFolder(ruta) 'Sección 4: Obtener archivos del objeto Folder For Each archivo In carpeta.Files ActiveCell.Value = ruta & archivo.Name ActiveCell.Offset(1, 0).Select Next 'Sección 5: Obtener subcarpetas del objeto Folder For Each subcarpeta In carpeta.SubFolders Mostrar_Archivos (subcarpeta) Next 'Sección 6: Auto-ajustar columnas y salir ActiveCell.EntireColumn.AutoFit Exit Sub ErrHandler: ActiveCell.Value = "Ruta inexistente" End Sub
En la sección 1 de código observarás la declaración de las variables utilizadas en la macro así como la creación del objeto FilsSystemObject y su asignación a la variable fs. La sección 2 analiza el parámetro ruta de la subrutina para saber si dicha cadena de texto está vacía y en tal caso salir del procedimiento. De lo contrario se revisa que dicha ruta termine con una diagonal invertida y de no ser así se hace una concatenación de dicho carácter.
El objetivo del código de la sección 3 es el de crear un objeto de tipo Folder que nos permita analizar el contenido de la carpeta. Esto se logra utilizando el método GetFolder del objeto FileSystemObject y el resultado es guardado en la variable carpeta. Es con el uso del método GetFolder que podemos obtener un error en VBA en caso de que la ruta indicada sea inválida por lo que he agregado la instrucción On Error GoTo para que en caso de obtener un error, la macro ejecute el código de la etiqueta ErrHandler que se encuentra al final del código y que imprimirá el mensaje “Ruta inexistente”.
En la sección 4 utilizamos la instrucción For Each para recorrer todos los archivos devueltos por el método Files y que están contenidos en la carpeta principal. Para cada archivo encontrado se concatena su ruta y su nombre y se asigna al valor de la celda activa. Posteriormente activamos la celda inferior a la celda activa de manera que la selección quede lista para el siguiente archivo.
La sección 5 obtiene las subcarpetas con el método SubFolders y para cada una de ellas se vuelve a ejecutar la macro Mostrar_Archivos lo cual ocasionará que se repita todo el proceso hasta imprimir todos los archivos contenidos en cada una de ellas.
Finalmente la sección 6 se encarga de auto ajustar el ancho de la columna de la celda activa de manera que se puedan visualizar correctamente todos los nombres de archivos. Finalmente se ejecuta la instrucción Exit Sub para salir del procedimiento.
Probando la macro
Para probar esta macro agregaré un botón ActiveX a la hoja y colocaré el siguiente código en su evento Click:
Utilizamos la función InputBox para permitir al usuario que ingrese la ruta de la carpeta de la cual se desean mostrar los archivos.
Para iniciar la prueba debo seleccionar la celda donde deseo que se listen los archivos ya que la macro comenzará a insertar los nombres a partir de la celda activa. Posteriormente hago clic en el botón y se mostrará el cuadro de diálogo solicitando la ruta de la carpeta.
Ingreso la ruta de la carpeta que contiene los archivos y al hacer clic en el botón Aceptar se ejecutará la macro y obtendremos el siguiente resultado.
Si comparas el contenido de las celdas de la columna A con los archivos mostrados en la imagen al inicio de este artículo podrás comprobar que se han listado todos los archivos de la carpeta principal y de sus subcarpetas.
A continuación dejo el vínculo de descarga que contiene el libro de trabajo con la macro recién creada. Además encontrarás la carpeta de ejemplo con los archivos y subcarpetas de manera que puedas realizar las pruebas por ti mismo.