Recorrer el contenido de una carpeta con DIR
La función DIR de Basic nos permite recorrer una carpeta y averiguar cual es su contenido.
Podemos obtener los archivos que contiene, las carpetas que contiene, y utilizar comodines para filtrar los resultados obtenidos.
La función DIR de oooBasic acepta dos parámetros o argumentos:- La ruta del directorio a explorar, o la ruta y nombre del archivo que ha de buscar. Admite el uso de comodines (* e ?)
- El tipo de resueltado devuelto: si especificamos un 0 devuelve archivos; un 16 devuelve carpetas.
Devuelve una cadena que contiene el resultado encontrado, o una cadena vacía cuando no encuentra nada o ha recorrido todo el directorio.
Cuando como primer argumento se le indica una carpeta (con o sin comodines) o una ruta y nombre de archivo con comodines, tiene un funcionamiento un poco especial, que nos permite recorrer la carpeta:
- Cuando se llama a la función DIR por primera vez indicando los argumentos devuelve la primera ocurrencia que cumple los parámetros especificados
- Si se la vuelve a llamar sin parámetros devuelve la segunda (y sucesivas) ocurrencias, hasta recorrer todo el directorio.
Ejemplos de código macro con DIR
Recorrer todos los archivos de una carpeta
Sub EjemploDir()
Dim cArchivo As String
cArchivo = Dir("C:\Program Files\OpenOffice 4\", 0)
Do While cArchivo>""
MsgBox cArchivo
cArchivo=Dir
Loop
MsgBox "No quedan más archivos"
End Sub
Obtendremos todos los archivos de la carpeta; no es necesario utilizar comodines.
Recorrer todas las carpetas de una carpeta
Sub EjemploDir()
Dim cArchivo As String
cArchivo = Dir("C:\Program Files\OpenOffice 4\", 16)
Do While cArchivo>""
MsgBox cArchivo
cArchivo=Dir
Loop
MsgBox "No quedan más archivos"
End Sub
En este caso obtendremos también las rutas . y .. como resultado. No es necesario utilizar comodines.
Recorrer todos los archivos de una carpeta con comodines
Sub EjemploDir()
Dim cArchivo As String
cArchivo = Dir("C:\Program Files\OpenOffice 4\*.txt", 0)
Do While cArchivo>""
MsgBox cArchivo
cArchivo=Dir
Loop
MsgBox "No quedan más archivos"
End Sub
Obtendremos todos los archivos con extensión .txt de la carpeta
Recorrer todas las carpetas de una carpeta con comodines
Sub EjemploDir()
Dim cArchivo As String
cArchivo = Dir("C:\Program Files\OpenOffice 4\p*", 16)
Do While cArchivo>""
MsgBox cArchivo
cArchivo=Dir
Loop
MsgBox "No quedan más archivos"
End Sub
Obtendremos todos los directorios que comiencen por la letra p de la carpeta.
Diferencias con la función DIR de VBA
Cuando indicamos en el segundo argumento el valor 16 (carpetas) tan sólo nos devuelve las carpetas; VBA devuelve carpetas y archivos. Si se especifica la directiva del compilador CompatibilityMode como True, su comportamiento es idéntico al de VBA.
En VBA el segundo argumento admite más tipos de valores, para devolver archivos ocultos, del sistema, etc. Estas opciones no funcionan en oooBasic, ya que estas características no existen en todos los sistemas operativos en los que se ejecuta AOO.
Uso de DIR con los comodines * e ?
Los comodines admitidos son:
- * Significa ningún, uno o cualquier número de carácteres alfanuméricos.
- ? Significa un único caracter alfanumérico en esa posición.
Por ejemplo:
Para recorrer | Comodines |
Todos los documentos de Calc | *.ods |
Todos los documentos que comienzan por Informe | Informe*.* |
Todas las carpetas que comienzan por Informe | Informe* |
Todas las carpetas que contienen 2014 | *2014* |
Todos los documentos que terminan por 2014 | *2014.* |
Todos los documentos Opendocument de AOO | *.od? |
5 comentarios
oye me puedes ayudar tengo una macro que usa do while y la funcion dir al final cuando ejemplo myfile = Dir
y tengo vairas facturas en la primera vuelta del circuito cuando llega a esta funcion Dir ya no tiene valor y se sale del ciclo como mantener el valor de dir hasta que se cumpla todas las facturas el ciclo.
Hola Gualberto
En este tema tienes un ejemplo claro de como crear un bucle do while para obtener todas las facturas de una carpeta.
Para ejecutar cualquier proceso con los archivos, debes llamarlo justo después de aplicar el dir, no al final del bucle.
Buen día SLV,
Agradezco tu comentario pero la verdad como tu me dices es de acuerdo al ejemplo pero, de esa forma ya lo intente pero no funciono, si tu te basaste al ejemplo. Mi macro tiene mucho mas código dentro del bucle, lo que me refiero es que la función Dir, sigue avanzando su recorrido sobre la carpeta indicada en la ruta, hasta que su valor es nada y esto lo hace ya sea que este después de lo que comentas, o al final del bucle. Podrías indicarme otro forma para detener el recorrido o como hacer que al final solo tome la segunda factura de mi carpeta.
Agradecere tu apoyo nuevamente o quien desee.
buenas tardes. Muchas gracias por la información.
He probado la rutina y me va de lujo, pero, ¿existe algun sistema para buscar un archivo dentro de las carpetas y las subcarpetas?
muchas gracias
Hola, muchas gracias por esta información.
¿Puedes decirme si también funcionaría con Thisworkbook.path & "*xlsx" ?
Es que estoy probando y no sé si estoy haciendo algo mal o es porque no funciona con este método.
Muchas gracias