Función Dir para archivos
La función Dir es una de las funciones más fundamentales y esenciales cuando se trabaja con archivos y carpetas en VBA. Es indispensable para tareas como obtener listas de archivos de carpetas específicas o verificar la existencia de archivos.
Este artículo cubre todo, desde el uso básico hasta técnicas avanzadas, incluyendo comparaciones con FileSystemObject, acompañado de ejemplos de código prácticos.
Cuándo necesitas la función Dir
En la práctica, usarás la función Dir en situaciones como estas:
- Procesamiento por lotes de múltiples archivos: Abrir todos los archivos Excel en una carpeta para agregación de datos
- Verificación de existencia de archivos: Confirmar que un archivo específico existe antes de procesarlo
- Creación de archivos de respaldo: Agregar números secuenciales al guardar si ya existe un archivo
- Gestión de archivos de registro: Eliminar archivos de registro antiguos
- Generación de informes: Buscar archivos que coincidan con un patrón específico y crear una lista
- Migración de datos: Importar todos los archivos CSV de una carpeta
Conceptos básicos de la función Dir
Sintaxis básica
Dir([ruta], [atributos])
La función Dir devuelve el nombre del primer archivo o carpeta que coincide con el patrón especificado.
Uso más simple
Sub DirBasico()
Dim nombreArchivo As String
' Obtener el primer archivo en la carpeta actual
nombreArchivo = Dir("*.*")
Debug.Print "Primer archivo: " & nombreArchivo
End Sub
Al llamar a Dir por primera vez, especifica la ruta. Para llamadas posteriores, llámala sin argumentos para obtener el siguiente archivo.
Obtener una lista de archivos
Sub ObtenerListaArchivos()
Dim rutaCarpeta As String
Dim nombreArchivo As String
' Especificar la ruta de la carpeta
rutaCarpeta = "C:\Users\TuNombre\Documents\"
' Obtener el primer archivo
nombreArchivo = Dir(rutaCarpeta & "*.*")
' Recorrer todos los archivos
Do While nombreArchivo <> ""
Debug.Print nombreArchivo
' Obtener el siguiente archivo
nombreArchivo = Dir()
Loop
End Sub
La función Dir requiere una ruta en la primera llamada, luego llama a Dir() sin argumentos para
obtener el siguiente archivo con los mismos criterios de búsqueda. Devuelve una cadena vacía ("")
cuando se han recuperado todos los archivos.
Uso de comodines
La función Dir soporta coincidencia de patrones con comodines (* y ?):
*(asterisco): Coincide con cero o más caracteres?(signo de interrogación): Coincide con cualquier carácter individual
Sub EjemplosComodines()
Dim nombreArchivo As String
Dim rutaCarpeta As String
rutaCarpeta = "C:\Datos\"
' Todos los archivos
Debug.Print "=== Todos los archivos ==="
nombreArchivo = Dir(rutaCarpeta & "*.*")
Do While nombreArchivo <> ""
Debug.Print nombreArchivo
nombreArchivo = Dir()
Loop
' Solo archivos Excel
Debug.Print "=== Archivos Excel ==="
nombreArchivo = Dir(rutaCarpeta & "*.xlsx")
Do While nombreArchivo <> ""
Debug.Print nombreArchivo
nombreArchivo = Dir()
Loop
' Patrón específico (archivos que comienzan con Informe_)
Debug.Print "=== Informe_* ==="
nombreArchivo = Dir(rutaCarpeta & "Informe_*.xlsx")
Do While nombreArchivo <> ""
Debug.Print nombreArchivo
nombreArchivo = Dir()
Loop
End Sub
Verificación de existencia de archivos
Verificación básica de existencia
Function ExisteArchivo(rutaArchivo As String) As Boolean
' Devuelve True si el archivo existe, False en caso contrario
ExisteArchivo = (Dir(rutaArchivo) <> "")
End Function
Sub ProbarExisteArchivo()
Dim rutaPrueba As String
rutaPrueba = "C:\Temp\ejemplo.xlsx"
If ExisteArchivo(rutaPrueba) Then
MsgBox "¡El archivo existe!", vbInformation
Else
MsgBox "Archivo no encontrado.", vbExclamation
End If
End Sub
Ejemplos prácticos
Recopilación de datos de todos los archivos Excel
Sub RecopilarDatosExcel()
Dim rutaCarpeta As String
Dim nombreArchivo As String
Dim wb As Workbook
Dim hojaResumen As Worksheet
Dim filaDestino As Long
rutaCarpeta = "C:\InformesMensuales\"
Set hojaResumen = ThisWorkbook.Sheets("Resumen")
filaDestino = 2
' Obtener archivos Excel
nombreArchivo = Dir(rutaCarpeta & "*.xlsx")
Application.ScreenUpdating = False
Do While nombreArchivo <> ""
' Abrir el libro de trabajo
Set wb = Workbooks.Open(rutaCarpeta & nombreArchivo, ReadOnly:=True)
' Copiar datos (ejemplo: valor de la celda A1)
hojaResumen.Cells(filaDestino, 1).Value = nombreArchivo
hojaResumen.Cells(filaDestino, 2).Value = wb.Sheets(1).Range("A1").Value
' Cerrar el libro de trabajo
wb.Close SaveChanges:=False
filaDestino = filaDestino + 1
nombreArchivo = Dir()
Loop
Application.ScreenUpdating = True
MsgBox "¡Recopilación de datos completa!", vbInformation
End Sub
Eliminar archivos antiguos
Sub EliminarArchivosAntiguos()
Dim rutaCarpeta As String
Dim nombreArchivo As String
Dim rutaArchivo As String
Dim fechaArchivo As Date
Dim fechaLimite As Date
Dim contadorEliminados As Integer
rutaCarpeta = "C:\Logs\"
fechaLimite = Date - 30 ' Eliminar archivos de más de 30 días
contadorEliminados = 0
nombreArchivo = Dir(rutaCarpeta & "*.log")
Do While nombreArchivo <> ""
rutaArchivo = rutaCarpeta & nombreArchivo
fechaArchivo = FileDateTime(rutaArchivo)
If fechaArchivo < fechaLimite Then
Kill rutaArchivo
contadorEliminados = contadorEliminados + 1
Debug.Print "Eliminado: " & nombreArchivo
End If
nombreArchivo = Dir()
Loop
MsgBox contadorEliminados & " archivos eliminados.", vbInformation
End Sub
Función Dir vs FileSystemObject
| Característica | Función Dir | FileSystemObject |
|---|---|---|
| Configuración de referencia | No requerida | Recomendada |
| Velocidad | Rápida | Ligeramente más lenta |
| Funcionalidad | Limitada | Rica |
| Soporte de subcarpetas recursivas | Implementación manual | Métodos integrados |
| Información de archivos | Solo básica | Detallada |
| Uso de memoria | Bajo | Mayor |
Resumen
La función Dir es una herramienta poderosa pero simple en VBA para operaciones de archivos. Puntos clave:
- Coincidencia de patrones con comodines (
*,?) - Llamar una vez con ruta, luego sin argumentos para archivos posteriores
- Devuelve cadena vacía cuando no hay más archivos
- Usar con vbDirectory para manejo de carpetas (requiere verificación GetAttr)
- Para operaciones complejas, considerar FileSystemObject
Domina estos conceptos básicos para manejar eficientemente diversas operaciones de archivos en tus proyectos VBA.