Bucle a través de archivos en una carpeta usando VBA

Bilal Shahid 8 octubre 2023
  1. Bucle a través de archivos en una carpeta usando VBA
  2. Utilice la función Dir
  3. Utilice el Objeto del sistema de archivos
  4. La mejor solución
  5. Conclusión
Bucle a través de archivos en una carpeta usando VBA

Visual Basic for Applications es un lenguaje de programación basado en eventos diseñado para Microsoft Office. Te permite automatizar tareas y personalizar funcionalidades según tus requerimientos.

VBA es bastante poderoso y le permite al usuario hacer todo con solo unas pocas declaraciones de código.

Este artículo explica cómo recorrer archivos almacenados en una carpeta usando VBA. A continuación, se analizan en detalle dos métodos y se proporcionan fragmentos de código.

Bucle a través de archivos en una carpeta usando VBA

VBA permite a los usuarios recorrer los archivos almacenados en un directorio específico y obtener sus nombres, marcas de tiempo, extensiones, etc. Puede realizar cualquier acción accediendo al directorio, por ejemplo, creando nuevos archivos o modificando los antiguos.

En este artículo se han mencionado dos soluciones, cada una con un tiempo de acceso diferente. VBA permite a los usuarios recorrer archivos en una carpeta usando la función Dir y creando un Objeto de sistema de archivos.

Las diferentes soluciones se analizan a continuación.

Utilice la función Dir

El siguiente fragmento de código permite al usuario recorrer archivos en una carpeta usando la función Dir. La función Dir se conoce como función de directorio.

Es una función VBA incorporada que toma la ruta del archivo como parámetro y devuelve el nombre del archivo.

Si la ruta representa una carpeta, la función Dir devuelve el nombre del primer archivo almacenado en la ruta. El siguiente fragmento de código representa cómo la función Dir ayuda a recorrer los archivos en una carpeta.

Sub example()
    Dim fileName As Variant
    fileName = Dir("C:\User\testfolder\")

    Do While Len(fileName) > 0

        ' Insert any action that must be performed on each file.

        Debug.Print fileName
        ' Prints file name to the immediate window

        fileName = Dir
        ' Set the file name to the next file name

    Loop

End Sub

Nota: Este es un fragmento de código y no el código completo. Puede editarlo según sus requisitos.

La función Dir proporciona una solución rápida y eficaz. Además, también tiene un tiempo de acceso rápido.

Si solo desea recorrer archivos específicos en la carpeta, puede aplicar una condición de prueba con la función Dir. La sintaxis para usar una condición de prueba con la función Dir se muestra a continuación.

Dir("C:\User\testfolder\*test*")

La *prueba* puede ser cualquier condición que desee aplicar a los archivos. Por ejemplo:

  1. Si solo desea recorrer los archivos de texto en la carpeta, use el siguiente comando: Dir("C:\User\testfolder\*.txt").
  2. Si solo desea recorrer los archivos que contienen "Finanzas" en sus nombres, use el siguiente comando: Dir("C:\User\testfolder\*Finance*").

Nota: Los argumentos de la función Dir también se pueden cambiar para devolver diferentes tipos de archivos, como ocultos, del sistema, etc.

Utilice el Objeto del sistema de archivos

La segunda solución crea un Objeto del sistema de archivos (FSO) para recorrer los archivos almacenados en la carpeta. Se utilizan diferentes funcionalidades del FSO para recorrer los archivos almacenados en la carpeta.

A continuación se comparte un fragmento de código.

Sub example()
   Dim Obj As Object, Source As Object, file As Variant
   Set Obj = CreateObject("Scripting.FileSystemObject")
   Set Source = Obj.GetFolder("C:\User\testfolder\")

   For Each file In Source.Files

      If InStr(file.Name, ".txt") > 0 Then
	      Debug.Print file.Name
      End If

   Next file
End Sub

El fragmento de código establece Fuente con la ruta de la carpeta específica. A continuación, se utiliza un bucle Para cada uno para recorrer todos los archivos de la carpeta.

Si no desea recorrer todos los archivos de la carpeta, puede usar el comando InStr(file.name, "test") > 0 y especificar el texto para filtrar los archivos. Si la condición devuelve “true”, las acciones que deben realizarse en esos archivos específicos se mencionarán dentro de la declaración if.

Sin embargo, hay un problema con el fragmento de código mencionado anteriormente.

La función del código archivo.nombre tiene un tiempo de ejecución lento. Se requieren unos segundos para devolver la respuesta al usuario.

Si no está utilizando una prueba para filtrar los archivos específicos, no necesitará la función file.name. En ese caso, funcionaría idealmente.

Puede recorrer fácil y rápidamente todos los archivos de la carpeta a través del fragmento de código mencionado.

Enlace anticipado de FSO frente a enlace tardío

Un Objeto del sistema de archivos se puede declarar de dos maneras: vinculación anticipada y vinculación tardía.

  1. Enlace anticipado

    El enlace temprano es cuando los enlaces de referencia, las bibliotecas, se verifican o agregan explícitamente en VBA. Las bibliotecas se pueden agregar desde Herramientas > Referencias en VBA.

    La ejecución fallará si el módulo no está disponible en su computadora. El enlace anticipado es muy útil para el proceso de desarrollo y depuración.

    Ofrece sugerencias del editor Intellisense para métodos de objeto, propiedades y constantes con nombre. Además, es más rápido que el enlace en tiempo de ejecución.

    En el enlace temprano, verifique los módulos/bibliotecas que necesita y declare los objetos de la siguiente manera.

    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject
    

    Otro método para declarar objetos en enlace anticipado es el siguiente:

    Dim FSO As New FileSystemObject
    
  2. Enlace tardío

    Las bibliotecas externas no están vinculadas en enlace en tiempo de ejecución. Es independiente de los enlaces de referencia, lo que lo hace ideal para la portabilidad y compatibilidad entre máquinas.

    No ofrece el editor Intellisense, por lo que las constantes específicas del objeto deben declararse explícitamente y proporcionarse por su valor.

    La siguiente sintaxis se puede utilizar para declarar un objeto en enlace en tiempo de ejecución.

    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    

La mejor solución

La solución con la función Dir funciona mejor que la solución que crea objetos para obtener archivos de la carpeta. La capacidad de prueba con la función Dir funciona de manera más eficiente que la solución que crea objetos para acceder a los archivos.

Puede crear macros que almacenen y ejecuten la funcionalidad requerida. Puede ejecutar la misma funcionalidad en diferentes carpetas con la ayuda de macros en Microsoft Office.

Conclusión

Las aplicaciones de Microsoft Office ofrecen numerosas funciones para sus usuarios. Con la adición de la programación en el lenguaje VBA, ha sido más fácil para los usuarios realizar tareas automatizadas con solo unas pocas líneas de código.

Hay varias soluciones para recorrer los archivos en una carpeta específica, así que sigue explorando.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

Artículo relacionado - VBA File