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:
- Establecer la referencia a la biblioteca de tiempo de ejecución de secuencias de comandos de Microsoft (Scrrun.dll)
- 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:
- En el Editor de VB, haga clic en Herramientas.
- Haga clic en Referencias.
- En el cuadro de diálogo Referencias que se abre, desplácese por las referencias disponibles y marque la opción "Microsoft Scripting Runtime".
- 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:
- 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.
- 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 |