Cuando usamos VBA en Excel, la mayor parte es para automatizar nuestras tareas.
Esto también significa que la mayor parte del tiempo, trabajamos con celdas y rangos, hojas de trabajo, libros de trabajo y otros objetos que son una parte de la aplicación Excel.
Pero VBA es mucho más potente y también se puede utilizar para trabajar con cosas fuera de Excel.
En este tutorial, le mostraré cómo utilizar VBA FileSystemObject (FSO) para trabajar con archivos y carpetas en su sistema o unidades de red.
Este tutorial cubre:
¿Qué es VBA FileSystemObject (FSO)?
FileSystemObject (FSO) le permite acceder al sistema de archivos de su ordenador. Utilizándolo, puede acceder y modificar los archivos/carpetas/directorios de su sistema informático.
Por ejemplo, a continuación se indican algunas de las cosas que puede hacer utilizando FileSystemObject en Excel VBA:
- Comprobar si existe un archivo o una carpeta.
- Crear o renombrar carpetas/archivos.
- Obtener una lista de todos los nombres de archivos (o nombres de subcarpetas) de una carpeta.
- Copiar archivos de una carpeta a otra.
Espero que te hagas una idea.
Cubriré todos estos ejemplos anteriores (y otros más) más adelante en este tutorial.
Aunque algunas de las cosas mencionadas anteriormente también se pueden hacer utilizando funciones VBA tradicionales (como la función DIR) y métodos, eso llevaría a códigos más largos y complicados. FileSystemObject facilita el trabajo con archivos y carpetas manteniendo el código limpio y corto.
Note: FSO can only be used in Excel 2000 and later versions.
¿A qué objetos se puede acceder a través de FileSystemObject?
Como he mencionado anteriormente, puede acceder y modificar archivos y carpetas utilizando el FileSystemObject en VBA.
Abajo hay una tabla que muestra los objetos más importantes a los que puedes acceder y modificar usando FSO:
Objeto | Descripción |
Drive | El objeto Drive te permite obtener información sobre la unidad como si existe o no, su nombre de ruta, el tipo de unidad (extraíble o fija), su tamaño, etc. |
Carpeta | El objeto Carpeta permite crear o modificar carpetas en el sistema. Por ejemplo, puede crear, eliminar, renombrar, copiar carpetas utilizando este objeto. |
File | File El objeto File le permite trabajar con archivos en su sistema. Por ejemplo, puede crear, abrir, copiar, mover y eliminar archivos utilizando este objeto. |
TextStream | El objeto TextStream le permite crear o leer archivos de texto. |
Cada uno de los objetos anteriores tiene métodos que puedes utilizar para trabajar con ellos.
Por poner un ejemplo, si quieres eliminar una carpeta, utilizarás el método DeleteFolder del objeto Folder. Del mismo modo, si quieres copiar un archivo, utilizarás el método CopyFile del objeto File.
No te preocupes si esto parece abrumador o difícil de entender. Usted obtendrá una comprensión mucho mejor cuando usted va a través de los ejemplos que he cubierto en este tutorial.
Sólo para el propósito de 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 por defecto en el Excel VBA.
Dado que estamos tratando con archivos y carpetas que están fuera de la aplicación de Excel, tenemos que crear primero una referencia a la biblioteca que contiene estos objetos (unidades, archivos, carpetas).
Ahora hay dos maneras de empezar a utilizar FileSystemObject en Excel VBA:
- Configurar la referencia a la biblioteca Microsoft Scripting Runtime Library (Scrrun.dll)
- Creando un objeto para referirse a la biblioteca desde el propio código
Aunque ambos métodos funcionan (y te mostraré cómo hacerlo a continuación), te recomiendo que utilices el primer método.
Configuración de la referencia a la biblioteca de tiempo de ejecución de Microsoft Scripting
Cuando se crea una referencia a la biblioteca de tiempo de ejecución de Scripting, permite a Excel VBA el acceso a todas las propiedades y métodos de archivos y carpetas. Una vez hecho esto, usted puede hacer referencia a los archivos/carpetas/objetos desde dentro de Excel VBA (al igual que usted puede hacer referencia a las celdas, hojas de trabajo o libros de trabajo).
A continuación se presentan los pasos para crear una referencia a la Biblioteca de Tiempo de Ejecución de Scripting de Microsoft:
- En el Editor 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 le permitirían ahora hacer referencia a los objetos FSO desde Excel VBA.
Crear una instancia de FileSystemObject en el código
Una vez que haya establecido la referencia a la biblioteca Scripting FileSystemObject, deberá crear una instancia del objeto FSO en su código.
Una vez creado, puede utilizarlo en VBA.
A continuación se muestra el código que establecerá la variable de objeto MyFSO como un objeto FileSystemObject:
Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub
En este código, primero he declarado la variable MyFSO como un objeto de tipo FileSystemObject. Esto es posible sólo porque he creado una referencia a la Microsoft Scripting Runtime Library. Si la referencia no está creada, esto va a dar un error (ya que Excel no reconocería lo que significa FileSystemObject).
En la segunda línea, ocurren dos cosas:
- La palabra clave NEW crea una instancia de FileSystemObject. Esto significa que ahora puedo utilizar 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 a esta nueva instancia de FileSystemObject. Esto me permite utilizar este objeto para acceder a archivos y carpetas. Por ejemplo, si necesito crear una carpeta, puedo utilizar el método MyFSO.CreateFolder.
Si quieres, también puedes combinar las dos sentencias anteriores en una sola, como se muestra a continuación:
Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Una gran ventaja de utilizar este método (que consiste en establecer la referencia a la Microsoft Scripting Runtime Library) es que cuando utilices los objetos FSO en tu código, podrás utilizar la función IntelliSense que muestra los métodos y propiedades asociados a un objeto (como se muestra a continuación).
Esto no es posible cuando se crea la referencia desde el código (cubierto a continuación).
Crear un objeto desde el código
Otra forma de crear una referencia a FSO es haciéndolo desde el código. En este método, no es necesario crear ninguna referencia (como se hace en el método anterior).
Cuando se está escribiendo el código, se puede crear un objeto desde el código y hacer referencia al Scripting.FileSystemObject.
El siguiente código crea un objeto FSO y luego hace que este sea de tipo FileSystemObject.
Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub
Aunque esto puede parecer más conveniente, una gran desventaja de usar este método es que no mostraría un IntelliSense cuando se trabaja con objetos en FSO. Para mí, esto es un gran negativo y siempre recomiendo utilizar el método anterior de habilitar FSO (que es mediante el establecimiento de la referencia a la ‘Microsoft Scripting Runtime’)
Ejemplos de VBA FileSystemObject
Ahora vamos a sumergirnos y echar un vistazo a algunos ejemplos prácticos de uso de FileSystemObject en Excel.
Ejemplo 1: Comprobar si un archivo o carpeta existe
El siguiente código comprobará si la carpeta con el nombre ‘Test’ existe o no (en la ubicación especificada).
Si la carpeta existe, la condición IF es True y muestra un mensaje – ‘The Folder Exists’ en un cuadro de mensaje. Y si no existe, muestra un mensaje – The Folder Does Not Exist’.
Sub CheckFolderExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Exists"Else MsgBox "The Folder Does Not Exist"End IfEnd Sub
De manera similar, también se puede comprobar 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 As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "The File Exists"Else MsgBox "The File Does Not Exist"End IfEnd Sub
Ejemplo 2: Crear una nueva carpeta en la ubicación especificada
El siguiente código crearía una carpeta con el nombre ‘Test’ en la unidad C de mi sistema (tendrás que especificar la ruta en tu sistema donde quieres crear la carpeta).
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.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 comprueba si la carpeta ya existe y crea una carpeta si no es así. 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 As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Already Exist"Else MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End IfEnd 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 de la carpeta especificada.
Sub GetFileNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MyFile In MyFolder.Files Debug.Print MyFile.NameNext MyFileEnd Sub
Este código es un poco más complejo que los que ya hemos visto.
Como mencioné anteriormente en este tutorial, cuando haces referencia a la ‘Microsoft Scripting Runtime Library’, puedes usar FileSystemObject así como todos los demás objetos (como Files y Folders).
En el código anterior, uso tres objetos – FileSystemObject, File, y Folder. Esto me permite ir a través de cada archivo en la carpeta especificada. A continuación, utilizo la propiedad name para obtener la lista de todos los nombres de los archivos.
Nota que estoy utilizando Debug.Print para obtener los nombres de todos los archivos. Estos nombres serán listados en la ventana inmediata del Editor VB.
Ejemplo 4: Obtener la lista de todas las subcarpetas de una carpeta
El siguiente código dará los nombres de todas las subcarpetas de la carpeta especificada. La lógica es exactamente la misma que en el ejemplo anterior. En lugar de archivos, en este código, hemos utilizado subcarpetas.
Sub GetSubFolderNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderDim MySubFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MySubFolder In MyFolder.SubFolders Debug.Print MySubFolder.NameNext MySubFolderEnd 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á a la carpeta ‘Destino’.
Sub CopyFile()Dim MyFSO As FileSystemObjectDim SourceFile As StringDim DestinationFolder As StringSet MyFSO = New Scripting.FileSystemObjectSourceFile = "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 utilizado dos variables – SourceFile y DestinationFolder.
FicheroFuente contiene la dirección del archivo que quiero copiar y la variable CarpetaDestino contiene la dirección de la carpeta en la que quiero que se copie el archivo.
Nota que no es suficiente con dar el nombre de la carpeta de destino cuando estás copiando un archivo. También es necesario especificar el nombre del archivo. Puede utilizar el mismo nombre de archivo o también puede cambiarlo. En el ejemplo anterior, copié el archivo y lo llamé 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 As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=FalseNext MyFileEnd Sub
El código anterior copiará todos los archivos de la carpeta de origen a la carpeta de destino.
Note que en el método MyFSO.CopyFile, he especificado que la propiedad ‘Overwritefiles’ sea False (es True por defecto). Esto asegura que en caso de que ya tengas el archivo en la carpeta, no se copie (y verás un error). Si quita ‘Sobrescribirarchivos’ o lo pone en Verdadero, en caso de que haya archivos en la carpeta de destino con el mismo nombre, éstos se sobrescribirían.
Si desea copiar los archivos de una determinada extensión sólo, puede hacerlo mediante el uso de una sentencia IF Then para comprobar si la extensión es xlsx o no.
Sub CopyExcelFilesOnly()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End IfNext MyFileEnd Sub
Métodos de FileSystemObject (FSO)
Aquí están los métodos que puede utilizar para cada objeto. Esto es sólo para fines de referencia y no se preocupa demasiado. El uso de algunos de ellos se ha mostrado en los ejemplos cubiertos anteriormente.
Métodos FSO | Para Objeto | Descripción |
DriveExists | Drive | Comprueba si la unidad existe o no |
GetDrive | Drive | Devuelve una instancia del objeto drive basada en la ruta especificada |
GetDriveName | Drive | Registra el nombre del drive |
ConstruirRuta | Archivo/Carpeta | Genera una ruta a partir de una ruta existente y un nombre |
CopiarArchivo | Archivo/Carpeta | Copia un archivo |
GetAbsolutePathName | File/Folder | Devuelve la representación canónica de la ruta |
GetBaseName | File/Folder | Devuelve el nombre base de una ruta. Por ejemplo, «D:\TestFolder\TestFile.xlsm» devolverá TextFile.xlsm |
ConseguirNombreTemporal | Archivo/Carpeta | Generar un nombre que se puede utilizar para nombrar un archivo temporal |
CopiarCarpeta | Carpeta | Copia una carpeta de una ubicación a otra |
CrearCarpeta | Carpeta | Crea una nueva carpeta |
BorrarCarpeta | Carpeta | Elimina la carpeta especificada |
CarpetaExiste | Folder | Comprueba si la carpeta existe o no |
GetFolder | Folder | Devuelve una instancia del objeto carpeta basada en la ruta especificada |
GetParentFolderName | Folder | Retorna el nombre de la carpeta padre basado en la ruta especificada |
GetSpecialFolder | Folder | Obtiene la ubicación de varias carpetas del sistema. |
MoverCarpeta | Mueve una carpeta de una ubicación a otra | |
BorrarArchivo | Archivo | Elimina un archivo |
FileExists | File | Comprueba si un archivo existe o no |
GetExtensionName | File | Devuelve la extensión del archivo |
GetFile | File | Devuelve la instancia de un archivo basado en la ruta especificada |
GetFileName | File | Devuelve el nombre del archivo |
GetFileVersion | File | Devuelve la versión del archivo |
MoveFile | File | Mueve un archivo |
CreateTextFile | File | Crea un archivo de texto |
GetStandardStream | File | Recupera la entrada estándar, output o error stream |
OpenTextFile | File | Abrir un archivo como TextStream |
También te pueden gustar los siguientes tutoriales de Excel:
- Obtener una lista de nombres de archivos de las carpetas & Subcarpetas (usando Power Query).
- Obtener la lista de nombres de archivos de una carpeta en Excel (con y sin VBA).
- Entender los tipos de datos de Excel VBA (variables y constantes).
- Crear una función definida por el usuario (UDF) en Excel VBA.