Uso de VBA FileSystemObject (FSO) en Excel: descripción general y ejemplos sencillos

Cuando usamos VBA en Excel, la mayor parte es para automatizar nuestras tareas.

Esto también significa que la mayoría de las veces, trabajamos con celdas y rangos, hojas de trabajo, libros de trabajo y otros objetos que forman parte de la aplicación Excel.

Pero VBA es mucho más poderoso y también se puede usar para trabajar con cosas fuera de Excel.

En este tutorial, le mostraré cómo usar VBA FileSystemObject (FSO) para trabajar con archivos y carpetas en su sistema o unidades de red.

¿Qué es VBA FileSystemObject (FSO)?

FileSystemObject (FSO) le permite acceder al sistema de archivos de su computadora. Utilizándolo, puede acceder y modificar los archivos / carpetas / directorios en su sistema informático.

Por ejemplo, a continuación se muestran algunas de las cosas que puede hacer utilizando FileSystemObject en Excel VBA:

  • Compruebe si existe un archivo o una carpeta.
  • Cree o cambie el nombre de carpetas / archivos.
  • Obtenga una lista de todos los nombres de archivos (o nombres de subcarpetas) en una carpeta.
  • Copie archivos de una carpeta a otra.

Espero que captes la idea.

Cubriré todos estos ejemplos anteriores (y más) más adelante en este tutorial.

Si bien algunas de las cosas mencionadas anteriormente también se pueden hacer utilizando funciones y métodos tradicionales de VBA (como la función DIR) y métodos, eso conduciría a códigos más largos y complicados. FileSystemObject facilita el trabajo con archivos y carpetas mientras mantiene el código limpio y breve.

Nota: FSO solo se puede utilizar en Excel 2000 y versiones posteriores.

¿A qué todos los objetos puede acceder a través de FileSystemObject?

Como mencioné anteriormente, puede acceder y modificar archivos y carpetas utilizando FileSystemObject en VBA.

A continuación se muestra una tabla que muestra los objetos más importantes a los que puede acceder y modificar usando FSO:

Objeto Descripción
Conducir Drive Object le permite obtener información sobre la unidad, como si existe o no, el nombre de la ruta, el tipo de unidad (extraíble o fija), su tamaño, etc.
Carpeta El objeto Carpeta le permite crear o modificar carpetas en su sistema. Por ejemplo, puede crear, eliminar, renombrar o copiar carpetas utilizando este objeto.
Archivo File Object le permite trabajar con archivos en su sistema. Por ejemplo, puede crear, abrir, copiar, mover y eliminar archivos usando este objeto.
TextStream El objeto TextStream le permite crear o leer archivos de texto.

Cada uno de los objetos anteriores tiene métodos que puede utilizar para trabajar con ellos.

Para darle un ejemplo, si desea eliminar una carpeta, utilizará el método DeleteFolder del objeto Folder. Del mismo modo, si desea copiar un archivo, utilizará el método CopyFile del objeto File.

No se preocupe si esto le parece abrumador o difícil de entender. Obtendrá una mejor comprensión cuando revise los ejemplos que he cubierto en este tutorial.

Solo como referencia, he cubierto todos los métodos FileSystemObject (para cada objeto) al final de este tutorial.

Habilitación de FileSystemObject en Excel VBA

FileSystemObject no está disponible de forma predeterminada en Excel VBA.

Dado que estamos tratando con archivos y carpetas que están fuera de la aplicación de Excel, primero debemos crear una referencia a la biblioteca que contiene estos objetos (unidades, archivos, carpetas).

Ahora hay dos formas de comenzar a usar FileSystemObject en Excel VBA:

  1. Establecer la referencia a la biblioteca de tiempo de ejecución de secuencias de comandos de Microsoft (Scrrun.dll)
  2. Crear un objeto para hacer referencia a la biblioteca desde el propio código

Si bien ambos métodos funcionan (y le mostraré cómo hacerlo a continuación), le recomiendo usar el primer método.

Nota: cuando habilita FileSystemObject, puede acceder a todos los objetos que contiene. Esto incluye FileSystemObject, Drive, Archivos, Carpetas, etc. Me enfocaré principalmente en FileSystemObject en este tutorial.

Establecer la referencia a la biblioteca de tiempo de ejecución de secuencias de comandos de Microsoft

Cuando crea una referencia a Scripting Runtime Library, le permite a Excel VBA el acceso a todas las propiedades y métodos de archivos y carpetas. Una vez hecho esto, puede consultar el objeto de archivos / carpetas / unidades desde dentro del VBA de Excel (al igual que puede consultar las celdas, hojas de trabajo o libros de trabajo).

A continuación, se muestran los pasos para crear una referencia a la biblioteca en tiempo de ejecución de secuencias de comandos de Microsoft:

  1. En el Editor de VB, haga clic en Herramientas.
  2. Haga clic en Referencias.
  3. En el cuadro de diálogo Referencias que se abre, desplácese por las referencias disponibles y marque la opción "Microsoft Scripting Runtime".
  4. Haga clic en Aceptar.

Los pasos anteriores ahora le permitirían hacer referencia a los objetos FSO de Excel VBA.

Creación de una instancia de FileSystemObject en el código

Una vez que haya establecido la referencia a la biblioteca Scripting FileSystemObject, debe crear una instancia del objeto FSO en su código.

Una vez creado esto, puede usarlo en VBA.

A continuación se muestra el código que establecerá la variable de objeto MyFSO como un objeto FileSystemObject:

Sub CreandoFSO () Atenuar MyFSO como FileSystemObject Establecer MyFSO = New FileSystemObject End Sub

En este código, primero he declarado la variable MyFSO como un objeto de tipo FileSystemObject. Esto es posible solo porque he creado una referencia a la biblioteca de tiempo de ejecución de secuencias de comandos de Microsoft. Si no se crea la referencia, esto le dará un error (ya que Excel no reconocería lo que significa FileSystemObject).

En la segunda línea, suceden dos cosas:

  1. La palabra clave NEW crea una instancia de FileSystemObject. Esto significa que ahora puedo usar todos los métodos de FileSystemObject para trabajar con archivos y carpetas. Si no crea esta instancia, no podrá acceder a los métodos de FSO.
  2. La palabra clave SET establece el objeto MyFSO en esta nueva instancia de FileSystemObject. Esto me permite usar este objeto para acceder a archivos y carpetas. Por ejemplo, si necesito crear una carpeta, puedo usar el método MyFSO.CreateFolder.

Si lo desea, también puede combinar las dos declaraciones anteriores en una como se muestra a continuación:

Sub CreandoFSO () Atenuar MyFSO como nuevo FileSystemObject End Sub

Un gran beneficio de usar este método (que es establecer la referencia a la biblioteca de tiempo de ejecución de secuencias de comandos de Microsoft) es que cuando usa los objetos FSO en su código, podrá usar la función IntelliSense que muestra los métodos y propiedades asociados con un objeto (como se muestra a continuación).

Esto no es posible cuando crea la referencia desde dentro del código (que se describe a continuación).

Crear un objeto a partir del código

Otra forma de crear una referencia a FSO es hacerlo desde el código. En este método, no es necesario crear ninguna referencia (como se hizo en el método anterior).

Cuando escribe el código, puede crear un objeto desde el código y consultar Scripting.FileSystemObject.

El siguiente código crea un objeto FSO y luego lo convierte en un tipo FileSystemObject.

Sub FSODemo () Dim FSO como conjunto de objetos FSO = CreateObject ("Scripting.FileSystemObject") End Sub

Si bien esto puede parecer más conveniente, una gran desventaja de usar este método es que no mostraría un IntelliSense cuando trabaja con objetos en FSO. Para mí, esto es muy negativo y siempre recomiendo usar el método anterior para habilitar FSO (que es estableciendo la referencia al "Microsoft Scripting Runtime")

Ejemplos de FileSystemObject de VBA

Ahora, profundicemos y echemos un vistazo a algunos ejemplos prácticos del uso de FileSystemObject en Excel.

Ejemplo 1: comprobar si existe un archivo o carpeta

El siguiente código verificará si la carpeta con el nombre "Prueba" existe o no (en la ubicación especificada).

Si la carpeta existe, la condición IF es Verdadera y muestra un mensaje: "La carpeta existe" en un cuadro de mensaje. Y si no existe, muestra un mensaje "La carpeta no existe".

Sub CheckFolderExist () Dim MyFSO como FileSystemObject Establecer MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Then MsgBox "The Folder Exists" Else MsgBox "The Folder Does Not Exist" End If End Sub

Del mismo modo, también puede verificar si un archivo existe o no.

El siguiente código comprueba si hay un archivo con el nombre Test.xlsx en la carpeta especificada o no.

Sub CheckFileExist () Dim MyFSO como FileSystemObject Establecer MyFSO = New FileSystemObject Si MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Entonces MsgBox "El archivo existe" Else MsgBox "El archivo no existe "End If End Sub

Ejemplo 2: crear una carpeta nueva en la ubicación especificada

El siguiente código crearía una carpeta con el nombre "Prueba" en la unidad C de mi sistema (tendrá que especificar la ruta en su sistema donde desea crear la carpeta).

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") End Sub

Si bien este código funciona bien, mostraría un error en caso de que la carpeta ya exista.

El siguiente código verifica si la carpeta ya existe y crea una carpeta si no existe. En caso de que la carpeta ya exista, muestra un mensaje. Para comprobar si la carpeta existe, he utilizado el Método FolderExists del FSO.

Sub CreateFolder () Dim MyFSO como FileSystemObject Establecer MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Then MsgBox "La carpeta ya existe" Else MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test ") End If End Sub

Ejemplo 3: obtener una lista de todos los archivos de una carpeta

El siguiente código mostraría los nombres de todos los archivos en la carpeta especificada.

Sub GetFileNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") para cada MyFile en MyFolder.Files Debug.Print MyFile.Name Siguiente MyFile End Sub

Este código es un poco más complejo que los que ya hemos visto.

Como mencioné anteriormente en este tutorial, cuando hace referencia a la "Biblioteca en tiempo de ejecución de secuencias de comandos de Microsoft", puede usar FileSystemObject, así como todos los demás objetos (como Archivos y Carpetas).

En el código anterior, utilizo tres objetos: FileSystemObject, File y Folder. Esto me permite revisar cada archivo en la carpeta especificada. Luego uso la propiedad de nombre para obtener la lista de todos los nombres de archivo.

Tenga en cuenta que estoy usando Debug.Print para obtener los nombres de todos los archivos. Estos nombres se enumerarán en la ventana inmediata del Editor de VB.

Ejemplo 4: obtener la lista de todas las subcarpetas de una carpeta

El siguiente código dará los nombres de todas las subcarpetas en la carpeta especificada. La lógica es exactamente la misma que se describe en el ejemplo anterior. En lugar de archivos, en este código, hemos utilizado subcarpetas.

Sub GetSubFolderNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") En MyFolder.SubFolders Debug.Print MySubFolder.Name Siguiente MySubFolder End Sub

Ejemplo 5: copiar un archivo de un lugar a otro

El siguiente código copiará el archivo de la carpeta "Fuente" y lo copiará en la carpeta "Destino".

Sub CopyFile () Dim MyFSO como FileSystemObject Dim SourceFile como cadena Dim DestinationFolder como conjunto de cadenas MyFSO = New Scripting.FileSystemObject SourceFile = "C: \ Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "MyFSO.CopyFile Source: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

En el código anterior, he usado dos variables: SourceFile y DestinationFolder.

El archivo de origen contiene la dirección del archivo que quiero copiar y la variable DestinationFolder contiene la dirección de la carpeta en la que quiero que se copie el archivo.

Tenga en cuenta que no es suficiente dar el nombre de la carpeta de destino cuando está copiando un archivo. También debe especificar el nombre del archivo. Puede usar el mismo nombre de archivo o también puede cambiarlo. En el ejemplo anterior, copié el archivo y lo nombré SampleFileCopy.xlsx

Ejemplo 6: copiar todos los archivos de una carpeta a otra

El siguiente código copiará todos los archivos de la carpeta de origen a la carpeta de destino.

Sub CopyAllFiles () Dim MyFSO como FileSystemObject Dim MyFile como archivo Dim SourceFolder como cadena Dim DestinationFolder como cadena Dim MyFolder como carpeta Dim MySubFolder como carpeta SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Establecer MyFSO = New Scripting.FileSystemObject Establecer MyFolder = MyFSO.GetFolder (SourceFolder) para cada MyFile en MyFolder.Files MyFSO.CopyFile Origen: = MyFSO.GetFile (MyFile), _ Destino: = DestinationFolder &" \ "& MyFile.Name, Overwritefiles: = Falso Siguiente MyFile End Sub

El código anterior copiará todos los archivos de la carpeta de origen a la carpeta de destino.

Tenga en cuenta que en el método MyFSO.CopyFile, he especificado que la propiedad "Overwritefiles" sea False (esto es True por defecto). Esto asegura que, en caso de que ya tenga el archivo en la carpeta, no se haya copiado (y verá un error). Si elimina "Overwritefiles" o lo establece en True, en caso de que haya archivos en la carpeta de destino con el mismo nombre, estos se sobrescribirán.

Consejo profesional: Al copiar archivos, siempre existe la posibilidad de sobrescribir archivos. Una buena idea, en este caso, es agregar la marca de tiempo junto con el nombre. Esto asegurará que los nombres sean siempre diferentes y que pueda rastrear fácilmente qué archivos se copiaron en qué momento.

Si solo desea copiar los archivos de una determinada extensión, puede hacerlo utilizando una instrucción IF Then para verificar si la extensión es xlsx o no.

Sub CopyExcelFilesOnly () Atenuar MyFSO como FileSystemObject Atenuar MyFile como archivo Atenuar SourceFolder como cadena Atenuar Carpeta de destino como cadena Atenuar MyFolder como carpeta Atenuar MySubFolder como carpeta SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Establecer MyFSO = New Scripting.FileSystemObject Establecer MyFolder = MyFSO.GetFolder (SourceFolder) para cada MyFile en MyFolder.Files Si MyFSO.GetExtensionName (MyFile) =" xlsx "Entonces MyFSO.CopyFile SourceG: = MyFSO. (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End If Next MyFile End Sub

Métodos FileSystemObject (FSO)

Estos son los métodos que puede utilizar para cada objeto. Esto es solo para fines de referencia y no se preocupe demasiado por eso. El uso de algunos de estos se ha mostrado en los ejemplos cubiertos anteriormente.

Métodos FSO Para objeto Descripción
DriveExists Conducir Comprueba si la unidad existe o no
GetDrive Conducir Devuelve una instancia del objeto de unidad en función de la ruta especificada
GetDriveName Conducir Vuelve a ejecutar el nombre de la unidad
Construir camino Archivo / Carpeta Genere una ruta a partir de una ruta existente y un nombre
Copiar archivo Archivo / Carpeta Copia un archivo
GetAbsolutePathName Archivo / Carpeta Devuelve la representación canónica de la ruta.
GetBaseName Archivo / Carpeta Devuelve el nombre base de una ruta. Por ejemplo, "D: \ TestFolder \ TestFile.xlsm" devolverá TextFile.xlsm
GetTempName Archivo / Carpeta Genere un nombre que pueda usarse para nombrar un archivo temporal
CopyFolder Carpeta Copia una carpeta de una ubicación a otra
Crear carpeta Carpeta Crea una nueva carpeta
Eliminar carpeta Carpeta Elimina la carpeta especificada
CarpetaExiste Carpeta Comprueba si la carpeta existe o no
GetFolder Carpeta Devuelve una instancia del objeto de carpeta según la ruta especificada
GetParentFolderName Carpeta Recupera el nombre de la carpeta principal según la ruta especificada
GetSpecialFolder Carpeta Obtenga la ubicación de varias carpetas del sistema.
MoveFolder Carpeta Mueve una carpeta de una ubicación a otra
Borrar archivo Archivo Elimina un archivo
El archivo existe Archivo Comprueba si un archivo existe o no
GetExtensionName Archivo Devuelve la extensión del archivo.
Obtener el archivo Archivo Devuelve la instancia de un objeto de archivo según la ruta especificada
GetFileName Archivo Devuelve el nombre del archivo.
GetFileVersion Archivo Devuelve la versión del archivo.
MoveFile Archivo Mueve un archivo
CreateTextFile Archivo Crea un archivo de texto
GetStandardStream Archivo Recuperar el flujo de entrada, salida o error estándar
OpenTextFile Archivo Abrir un archivo como TextStream

Va a ayudar al desarrollo del sitio, compartir la página con sus amigos

wave wave wave wave wave