En este ejercicio veremos un ejemplo para listar archivos de una carpeta con macro excel ( algo similar se ha usado en la App CFDIControlFX ), esta lista sera creada en una hoja del libro, ademas sera posible indicar el tipo de archivo que queremos filtrar.
Las macros son una poderosa herramienta para potenciar aun mas el trabajo con excel, el manejo de archivos no podía quedar fuera, vba contempla funciones que ayudan en la creación de procedimientos para interactuar con archivos, ya sea para abrirlos, escribir en ellos o simplemente obtener sus nombres.
Seleccionar Carpeta
Para generar la lista de archivos es necesario seleccionar una carpeta de la que deseamos obtener dichos archivos, para ello es necesario crear una función que genere la ventana para hacer la selección.
Function MiRuta()
Dim directorio As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Seleccionar Carpeta"
.Show
directorio = .SelectedItems(1)
End With
If directorio <> "" Then
MiRuta = directorio
End If
End Function
Cuando esa función sea llamada desde algún procedimiento, se abre una ventana del explorador de Windows, podrás moverte entre las carpetas y seleccionar la que desees.
Obtener nombres de archivos de la carpeta seleccionada
Ahora que se ha seleccionado una carpeta, es necesario obtener la lista de archivos que contiene, de tal modo que se puedan poner esos nombres en una de las hojas.
Sub ListArchivos()
Dim ruta, archivos As String
Dim i As Integer
'obtener ruta
ruta = MiRuta
archivos = Dir(ruta & "\*.xml*")
wsArchivos.Range("A2:A" & wsArchivos.Cells(Rows.Count, 1).End(xlUp).Row) = ""
i = 2
Do While Len(archivos) > 0
wsArchivos.Cells(i, 1) = archivos
archivos = Dir()
i = i + 1
Loop
End Sub
Esta macro llama a la función que se creo primero para abrir una ventana del explorador de windows y seleccionar la carpeta, luego mediante un loop se recorren los nombres de archivo y se ingresan en una hoja.
Filtrar por tipo de archivo
Una buena característica de esta macro es que puedes filtrar por tipo de archivo, es decir, generar la lista solo con los archivos de un tipo especifico.
Para esto solo debes editar la siguiente linea
archivos = Dir(ruta & "\*.xml*")
Simplemente deberás cambiar el dato que esta entre * * por la extensión del tipo de archivos que deseas obtener.
Que aplicaciones tiene esta macro
Como se ha observado, listar Archivos de una carpeta con macro excel resulta muy útil, de entrada la aplicación mas simple es la generación de la lista de archivos, pero igual puedes usarla en muchos otros proyectos donde es necesario trabajar con otros archivos, esto evidentemente dependerá directamente de tu proyecto, de momento ahora tienes este ejemplo y en su caso podría ser de ayuda en alguno de tus casos de trabajo.
gustavo dice
buenos tardes , muy interesante el aporte , os agradecería si me pudieseis ayudar y es que para yo luego hacer hipervínculos a esos datos necesitaría que me añadiese la ruta entera , que tendría que añadir a la macro ?
Alejandro González González dice
Soy ingeniero civil, y me sirven muchas hojas de las que has creado y de tu conocimiento sobre hacer más ágil nuestro trabajo. Agradecido con tu valiosa aportación a los demás.
Vicente Cereza dice
Buenas Nolbert,
Bueno lo primero agradecerte toda la información que compartes, ya que es muy útil y me está permitiendo aprender a programar un poquito más.
He utilizado la macro y funciona perfectamente, pero me gustaría saber si existe alguna forma de adaptarla para que también liste los archivos que existen en las subcarpetas de la carpeta.
La verdad es que soy bastante primerizo en el tema y no se me ocurre la forma de hacerlo.
Muchas gracias.
Un saludo.
Rogelio dice
Cual sería la variable para declarar el campo “Duración” de un archivo .mp3
Ing. Eduardo Coronel Recalde dice
Me parece muy intereseante esta herramienta
Julio dice
Buen día Sr. Nolberto
Primero, quiero agradecerle por su tiempo y a la vez felicitarlo por su sitio, así como la forma tan clara en que explica cada procedimiento.
No tengo mucha experiencia con macros, analizando y replicando su macro para listar archivos, me funciona bien hasta el momento en que se deben de borrar los archivos para crear la lista nueva, en ese punto me manda el error “1004” en tiempo de ejecución y no se porque.
Le agradecería mucho si puede instruirme para solucionar este inconveniente.
Gracias
Hernán dice
Hola Nolberto.
Tengo el siguiente código para listado de carpetas, subcarpetas y archivos.
El tema es que colocando puntos de interrupción, he visto que por cada archivo que lista, el código llega hasta abajo instalando cada vez una fórmula en A1, y realizando autofit de columnas A a E, cuando debería hacerlo al final del listado.
¿Qué estaría faltando allí?.
Desde ya muchas gracias por su tiempo.
Éste es el código:
Private Sub CommandButton1_Click()
‘ ‘Ruta en CommandButton
‘ CommandButton1_Click Macro
‘
‘
Ruta = InputBox(“Ingresar Ruta”)
LIsta_de_archivos (Ruta)
End Sub
Sub LIsta_de_archivos(Ruta)
Application.ScreenUpdating = True
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Dim Carpeta As String: Carpeta = Ruta
Sheets(“Listado”).Select
ActiveSheet.Unprotect Password:=”HGB1968″
Cells.Select
Selection.ClearContents
Range(“A2:E2”) = Array(“Ruta”, “Nombre”, “Tamaño”, “Modificado”, “Tipo”)
Listar_archivos_en Carpeta, True
End Sub
Sub Listar_archivos_en(Carpeta As String, Completo As Boolean)
Application.ScreenUpdating = True
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Dim Archivo, SubCarpeta, Fila As Long
Fila = Range(“A65536”).End(xlUp).Row + 1
With CreateObject(“scripting.filesystemobject”)
With .GetFolder(Carpeta)
For Each Archivo In .Files
With Archivo
Range(“a” & Fila & “:e” & Fila) = Array( _
Application.Substitute(.Path, .Name, “”), .Name, .Size, .DateLastModified, .Type)
End With
Fila = Fila + 1
Next
If Completo Then
For Each SubCarpeta In .SubFolders
Listar_archivos_en SubCarpeta.Path, True
Next
End If
End With
End With
‘a partir de aquí sigue hacia abajo, realizando con cada uno de los archivos éste procedimiento. O sea que sobrepasa el Next hacia abajo cuando debería ir hacia arriba.
Range(“A1”).Select
ActiveCell.FormulaR1C1 = _
“=CONCATENATE(“”ARCHIVOS:””,”” “”,COUNTA(R[2]C:R[1048575]C))”
Debug.Print ActiveSheet.UsedRange.Address
Columns(“A:E”).Select
Selection.ColumnWidth = 100
Columns(“A:E”).EntireColumn.AutoFit
Range(“B1”).Select
End Sub
Sebastián dice
Muy buena solo que noy ningún orden a la hora de listar