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

dir_basico.bas
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

dir_lista_archivos.bas
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
dir_comodines.bas
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

dir_existe_archivo.bas
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

dir_recopilar_datos.bas
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

dir_eliminar_antiguos.bas
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ísticaFunción DirFileSystemObject
Configuración de referenciaNo requeridaRecomendada
VelocidadRápidaLigeramente más lenta
FuncionalidadLimitadaRica
Soporte de subcarpetas recursivasImplementación manualMétodos integrados
Información de archivosSolo básicaDetallada
Uso de memoriaBajoMayor

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.

#VBA #Función Dir #Operaciones de archivos #Operaciones de carpetas #FileSystemObject