Macro para Recorrer Carpeta para abrir un archivo especifico

Hola, como pueden ver en la imagen tengo una carpeta TIENDAS, en la cual están alojadas muchas tiendas como por ejemplo Angamos, Aramburu y Ayacucho. Lo que necesito es una macro que haga un recorrido por todas las tiendas que haya en la carpeta Tiendas, en este caso solo hay 3 pero pueden haber más y quisiera que haga un bucle para que entre a todas las carpetas de Tienda.

He encontrado FileSystemObject, no se que tan útil sea para el caso particular que necesito, actualmente la macro corre abriendo todas las carpetas pero cuando se crea una nueva dificulpa a la compañía tener que llamarme. Por favor Genios del Excel su ayuda para ver que puedo hacer.

Respuesta
1

Bueno hacer un bucle por carpetas es muy divertido... ¿y luego que? ¿Qué es lo que quieres hacer?

Y sí, FileSystemObject probablemente sea tu mejor opción.

A ver, puedes usar esta función:

Sub DoFolder(Folder)
    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    For Each File In Folder.Files
        'cambia el debug.print por lo que quieras hacer con los archivos'
        Debug.Print File.Name
    Next
End Sub

A eso hay que pasarle el parámetro "Folder" que debería ser la ruta de la carpeta TIENDAS que seria algo así como una ruta fija. Lo puedes hacer de la siguiente forma:

Dim FileSystem As Object
Dim HostFolder As String
'cambia esto a la ruta de la carpeta TIENDAS'
HostFolder = "C:\TIENDAS\"
Set FileSystem = CreateObject("Scripting.FileSystemObject")
DoFolder FileSystem. GetFolder(HostFolder)

y bueno el código que ejecutas es el segundo, lo pones en cualquier Sub, en un botón o donde tu quieras.

Andy M.

Voy a darle una línea a tu código amigo, muchas Gracias, mira lo que quiero es hacer que la macro recorra cada carpeta y busque un archivo lo abra copie la data de este archivo y lo consolide en una carpeta consolidadora.

Actualmente ya consolida todo la macro pero lo hice así poniendo toda la ruta completa, lo que no funciona cuando agregan una nueva carpeta pues no la reconoce.

Más tarde voy a darle un ojo al código y lo intento, muchas gracias por tu pronta respuesto! Un saludo!

Vale si el archivo que buscas tiene el mismo nombre en todas las carpetas, puedes usar una condición así como:

If File.Name = "Nombre del archivo.txt" Then
    'aqui haces lo que quieras con el archivo'
End If

Andy M.

¡Gracias!

Hola, Esta Genial. Cuando ejecuto lo que hace es listarme todos los archivos uno a uno, creo que estoy viendo la luz en el túnel. Gracias por eso! Pero sabes me estoy rompiendo la cabeza intentando que esto sea secuencial, ejemplo que la macro pueda abrir todos los archivos que comiencen con las letras VE y terminen en . DBF uno a uno, que abra uno, haga una consolidación con el libro y luego lo cierre y continué con el otro. ¿De qué forma lo harías Andy? Disculpa que sea un poco tonto al explicarlo es que no soy programador de macros pero me gusta mucho y recién estoy aprendiendo. Muchas Gracias!

Bueno puedes comprobar el nombre con esta instrucción:

If Left(File.Name, 2) = "VE" And Right(File.Name, 4) = ".DBF" Then
     'aqui abres cada uno y lo trabajas'
End If

El código dice que solo se fije en los archivos cuyos 2 primeros caracteres son VE y, ademas, los últimos 4 sean .DBF

Ahora bien, ten en cuenta que esa comprobación es Case-Sensitive, osea que influye mayúsculas y minúsculas, no es igual VE que ve, ni .DBF que .dbf por lo que en tus carpetas debería haber consistencia en el nombre de los archivos.

Pero esto no termina ahí, los dbf son archivos de bases de datos. Hay dos formas de abrirlos en excel.

1- Usando el propio evento "Abrir" de Excel con la categoría dBase Files

2- Haciendo una conexión al archivo como si la hicieras a la mismísima base de datos

¿Cuál usar?

Bueno depende del archivo. Si quieres puedes subir uno a alguna nube y compartirlo conmigo para inspeccionarlo.

O talvez tu ya tienes el código para hacer eso, y solo necesitabas el de recorrer las carpetas, ya me dirás.

Andy M.

¡Gracias!

Sub DoFolder(Folder)
    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    For Each File In Folder.Files
    If Left(File.Name, 2) = "VE" And Right(File.Name, 4) = ".DBF" Then
    MsgBox (File.Name)
    End If

Mira, tengo este y lo que hace es listar todos los archivos con el mismo formato (todos los archivos tienen el mismo nombre, pero diferente ruta), como crees que podria abrirlos uno a uno, abrir y copiar la informacion en mi archivo principal y luego cerrar y pasar con el siguiente?.  En realidad creo que esta es la mejor alternativa para obtener el consolidado y con esto el reporte, ya que no hay forma de conectar directamente a todos estos archivos. Saludos! y muchas gracias!!

Hola Andy, logre modificar el código y ya tengo básicamente lo que necesito, dentro de este código solo necesitaría dos cosas, una es como igualar el filedatetime que me da fecha y hora con una fecha, yo quiero que solo me abra los archivos del día de hoy. Y por otro lado para abrir los archivos necesitaría la ruta del archivo concatenado con el filename, por eso quería saber como podría obtener ese dato. Muchas Gracias!

Sub DoFolder(Folder)
    Dim SubFolder
    Dim fecha
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    For Each File In Folder.Files
    If Left(File.Name, 2) = "VE" And Right(File.Name, 4) = ".DBF" And FileDateTime(File) > "12/12/20" Then
    MsgBox (FileDateTime(File))
    End If
    Next
    End Sub

Hola Andy, estoy creativo y ya tengo solucionado lo del día pero necesito precisar como obtener la ruta del archivo, intente con esto pero no logro hacerlo

Sub DoFolder(Folder)
    Dim SubFolder
    Dim fecha
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    For Each File In Folder.Files
    If Left(File.Name, 2) = "VE" And Right(File.Name, 4) = ".DBF" And Year(FileDateTime(File)) _
    = Year(Now) And Month(FileDateTime(File)) = Month(Now) And Day(FileDateTime(File)) = Day(Now) Then
    'Workbooks.OpenText Filename:="D:\TIENDAS\Angamos\caja 1\VE??????.DBF"
    'ruta = ActiveWorkbook.Path
    MsgBox (carpeta)
    End If
    Next
    End Sub

Disculpa la demora, el objeto que hemos creado tiene una propiedad llamada Path, así que si pones File. Path debería darte la ruta completa. Puedes hacer un test con Debug. Print, ya lo probé y me da la ruta, mira:

Andy M.

¡Gracias Andy!, Exacto ya lo revise y va de lujo, ya logre abrir y correr todo el proceso con el bucle y te cuento un poco, este el contenido que se abre en el bucle.

Tengo 2 inconvenientes

1. En esta línea lo que hago es comparar la ruta que tengo mapeada con la ruta de donde obtiene el archivo y según comparo con la ruta actual del archivo abierto y con eso detecto la zona y almaceno esto en una variable para asignarle el valor a la columna NombreTienda, el problema de este es que si aumentan las tiendas ya no tendría mapeado como se llamaran estas y no podría hacer la comparación, que alternativa me recomendarías para almacenar de la ruta o de otra parte lo que dice "Angamos", que puede ser cualquier nombre de cualquier longitud.

If ruta = "D:\TIENDAS\Angamos\caja 1" Then tienda = "Angamos"

2. Otro problema que tengo es que aqui busco jalar la data de mi tabla BaseDeDatos, pero me surge el problema de que jala los encabezados y cuando lo consolido me jala una fila adicional, lo que quisiera es que jale la tabla pero luego quitarla, no se si en la hoja input o en la hoja destino y de que modo seria mejor, lo intente borrando manualmente pero se complico.

'ActiveSheet.ListObjects("BaseDeDatos").DataBodyRange.Select
[BaseDeDatos].Select
Selection.Copy

Disculpa que demore, es que hoy es día de Champions ja!

A ver, lo primero se puede resolver usando Split. Por lo que entiendo, quieres saber el nombre de la tienda, basado en la ruta, y veo que el nombre de la tienda es el mismo que el nombre de la carpeta padre del archivo.

Así que, volviendo a nuestro código, podríamos decirle que: una vez tengas la ruta del archivo, dame también el nombre de la carpeta padre de ese archivo. Así:

Fíjate que agregue un par de variables nuevas de tipo texto, una de ellas es un Array que va a contener cada Texto separado por cada "\" osea, cada carpeta de la ruta.

El ultimo campo del array, seria el nombre del archivo como tal, el .dbf, ese no lo queremos, queremos el nombre de la carpeta que esta antes. Y lo obtenemos con la linea:

StoreName = StorePath(UBound(StorePath) - 1)

Esa linea dice, dame el ultimo - 1 ese menos 1 es la clave para obtener el penúltimo.

Andy M.

Y con lo segundo, pues tengo duda. Supongo que debería ver el archivo, no me queda claro cual es el problema.

Esto se esta haciendo largo. Tal vez y sea mejor que crees una pregunta nueva. Me la puedes hacer por privado si quieres.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas