Usando el FileSystemObject (FSO) en Excel VBA

El FileSystemObject (FSO) le da acceso a toda una gama de funciones para acceder al sistema de archivos de su ordenador. Usando este objeto, puede acceder fácilmente a los archivos, carpetas y unidades, y también leer y escribir en los archivos.

Muchas de las funciones del FSO podrían ser escritas por usted en VBA tradicional, pero requerirían más codificación, y serían más difíciles de mantener y entender para un desarrollador entrante. El FSO es una API (Interfaz de Programación de Aplicaciones) probada y comprobada y es más fiable que su propio código. Es fácil de usar y está listo y disponible.

El FSO funciona con los estándares internacionales y la configuración que usted tiene en su ordenador. Si usted está distribuyendo su aplicación de Excel en todo el mundo a continuación, utilizando el FSO se encargará de cualquier diferencia en la configuración entre los países, que su propio código tendría problemas para hacer.

El FSO le permitirá hacer casi todo en el código VBA que usted podría hacer en el Explorador de archivos de Windows. Le da acceso completo al sistema de archivos de Windows.

Creación de un FileSystemObject

El FileSytemObject no forma parte de Excel VBA. Puede utilizar el FSO mediante la creación de un objeto (enlace tardío) en VBA:

Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub

Alternativamente, puede añadir una referencia en VBA para la biblioteca FSO. Esto se llama vinculación temprana y es más rápido que la vinculación tardía, ya que el objeto no tiene que ser creado cuando su código se ejecuta.

Para añadir una referencia, debe pulsar Alt-F11 para entrar en el Editor de Visual Basic (VBE), y luego utilizar ‘Herramientas|Referencias’ del menú VBE. Esto mostrará una ventana emergente para que selecciones la referencia relevante (ver abajo).

Desplázate hacia abajo en la lista de referencias disponibles hasta que puedas ver ‘Microsoft Scripting Runtime’. Marque la casilla y haga clic en Aceptar, y la biblioteca es ahora parte de su aplicación.

La ubicación del archivo de la biblioteca DLL es C:\Windows\SysWOW64\scrrun.dll

Si está distribuyendo su aplicación a otros colegas o lugares, es esencial que tengan este archivo en la ubicación correcta en su ordenador, de lo contrario su código dará error.

Vale la pena poner una trampa de error en el evento ‘WorkbookOpen’ utilizando el comando Dir para comprobar que el archivo existe. Si no existe, entonces dé un mensaje de advertencia y cierre el archivo de Excel.

Una vez añadida la referencia, puede utilizar el siguiente código para crear el FSO:

Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub

Todos los ejemplos de este artículo utilizarán esta metodología para crear el FSO.

El FSO tiene muchos métodos y propiedades disponibles. Estos se dividen aquí en secciones según lo que pueden hacer.

Usando los métodos ‘Exists’

Puede utilizar un método FSO para comprobar si una unidad, una carpeta o un archivo existe. Estos métodos son fáciles de usar y sólo requieren un parámetro.

Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub

Todas estas sentencias devolverán ‘True’ asumiendo que su ordenador tiene una unidad C:, una carpeta en ella llamada ‘Temp’ y un archivo en la carpeta Temp llamado ‘testfile.txt’

Las cadenas de texto en los parámetros no distinguen entre mayúsculas y minúsculas. No puede utilizar comodines en ninguno de estos métodos.

Tampoco puede utilizar URLs (Uniform Resource Locators) para describir la ubicación de una carpeta o archivo. El FSO funciona exclusivamente en el sistema operativo Windows y en el sistema de archivos de éste. Para una ubicación en un servidor externo, es necesario asignar una unidad de disco a esto en primer lugar, y luego utilizar la ruta de la unidad en sí.

Usando los métodos ‘Get’

El FSO tiene numerosos métodos para obtener información sobre el archivo y la ruta, ya sea dividiendo la ruta y el archivo, u obteniendo información del archivo o la carpeta como la fecha de creación o la fecha de modificación.

GetAbsolutePathname

Esto proporcionará una ruta completa desde la raíz de la unidad especificada.

La sintaxis es:

GetAbsolutePathName (pathpec)

Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub

Esto devolverá una cadena ‘C:\N-Users\NRichard\NDocuments’. Esto se debe a que la ruta se ha especificado como C: seguido de tres puntos. Cada punto significa un nivel siguiente dentro de la estructura de carpetas.

GetBaseName

Esto devuelve el nombre de un archivo o carpeta especificado.

La sintaxis es:

GetBaseName (path)

Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub

Este código devolverá ‘testfile’. El método devuelve la última sección del nombre de la ruta. Si se trata de un archivo, entonces no devuelve el sufijo del archivo.

Si la ruta no se puede encontrar, entonces se devolverá una cadena en blanco.

GetDrive

Esto le permite utilizar el código para acceder a la información de la unidad, basado en la letra de la unidad especificada.

La sintaxis es:

GetDrive (drivespec)

Sub DriveInfo()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Set Dr = MyFSO.GetDrive(Pth)MsgBox Dr.FreeSpaceEnd Sub

Este método devuelve un objeto drive basado en la unidad especificada. Puede utilizar este objeto para acceder a información sobre la unidad, como el espacio libre disponible.

GetDriveName

Este método separará el nombre de la unidad de una cadena de ruta / nombre de archivo.

La sintaxis es:

GetDriveName (path)

Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub

Esto devolverá ‘C:’

GetExtensionName

Esto devolverá el sufijo del archivo en la ruta especificada.

La sintaxis es:

GetExtensionName (path)

Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub

Esto devolverá ‘txt’.

Si no se especifica ningún archivo, se devolverá una cadena vacía.

GetFile

Este método devuelve un objeto archivo, que contiene diversa información sobre el propio archivo.

La sintaxis es:

GetFile (filespec)

Sub FileInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C:\temp\testfile.txt"Set Fn = MyFSO.GetFile(Pth)MsgBox Fn.DateCreatedEnd Sub

Esto devolverá la fecha y hora en que se creó el archivo especificado. Si no se especifica ningún archivo o el archivo no existe, obtendrá un error ‘archivo no encontrado’.

Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub

Esto devolverá ‘testfile.txt’.

GetFolder

Esto crea un objeto carpeta para la carpeta base en la ruta especificada. La ruta sólo debe contener nombres de carpetas. No debe incluirse ningún nombre de archivo, de lo contrario se producirá un error.

La sintaxis es:

GetFolder (folderspec)

Sub FolderInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)MsgBox Fo.DateCreatedEnd Sub

El objeto carpeta tiene diversa información en él a la que se puede acceder. En este caso, devuelve la fecha de creación de la carpeta.

También puede utilizar este método para recuperar todos los nombres de archivo dentro de una carpeta determinada:

Sub FileNames()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)For Each Fn In Fo.Files MsgBox Fn.NameNext FnEnd Sub

Este código iterará a través de la carpeta ‘Temp’ y mostrará cada nombre de archivo encontrado.

GetParentFolderName

Este método devolverá el nombre de la carpeta en el siguiente nivel de la jerarquía de carpetas.

La sintaxis es:

GetParentFolderName (path)

Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub

Esto devolverá ‘Users’ ya que es el ‘padre’ de la carpeta ‘richard’.

Usando los métodos ‘Create’

Con el FSO puede crear una nueva carpeta y ruta y crear un archivo de texto.

CreateFolder

Puede especificar un nuevo nombre de ruta de la carpeta a crear. Un peligro de esto es que si la carpeta ya existe, entonces se producirá un error. Puede utilizar el método ‘FolderExists’ para asegurarse de que esto no sucederá.

La sintaxis es:

CreateFolder (foldername)

Sub CreateNewFolder()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\MyFolder"If MyFSO.FolderExists(Pth) = False Then MyFSO.CreateFolder (Pth)End IfEnd Sub

Este código creará una nueva carpeta llamada ‘MyFolder’ bajo la ruta existente ‘C:\temp’.

CrearArchivoDeTexto

Este método permite crear un archivo de texto simple y escribir directamente en él.

La sintaxis es:

CrearArchivoDeTexto (nombre de archivo, ])

Sub CreateTextFile()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\Myfile.txt"Set Fn = MyFSO.CreateTextFile(Pth,True)Fn.Write "Add my own text here" & vbLf & "This is the second line"Fn.CloseEnd Sub

Este código crea un archivo de texto llamado ‘Miarchivo.txt’ en la carpeta ‘Temp’ de la unidad ‘C:’ y luego escribe dos líneas de texto en él.

Nótese que se concatena un carácter de avance de línea en la cadena que se escribe.

Si la ruta a la que se escribe no existe, se producirá un error. Puede utilizar el método ‘FolderExists’ para comprobarlo antes de crear el archivo.

Hay un parámetro opcional para sobrescribir el archivo existente si es necesario – puede ser True o False. El valor predeterminado es True.

Usando los métodos ‘Copy’

Puede utilizar estos métodos para copiar un archivo o una carpeta a otra ubicación.

CopyFile

Este método copiará un archivo de una ubicación de carpeta a otra. Tenga en cuenta que la copia fallará si la ubicación de destino tiene el atributo de sólo lectura establecido.

La sintaxis es:

CopyFile origen, destino,

Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub

Este código hará una copia de todos los archivos de texto (txt) en ‘C:\temp’ en ‘C:\temp\myfolder\’, sobrescribiendo el archivo donde sea necesario. La configuración por defecto de Sobrescribir es Verdadero.

Puede utilizar un asterisco (*) como comodín para los nombres de los archivos, pero no puede utilizar un signo de interrogación (?) como comodín para representar caracteres individuales.

CopiarCarpeta

Puede utilizar este método para copiar una carpeta completa de una ubicación a otra.

La sintaxis es:

CopiarCarpeta origen, destino,

Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub

Este código copia todas las carpetas y archivos que se encuentran debajo de ‘C:\temp’ en ‘C:\users\richard’. La nueva carpeta creada será ‘C:\users\richard\myfolder’ ya que ‘C:\temp’ tenía una carpeta dentro de ella llamada ‘myfolder’.

Hay cuatro resultados posibles cuando se utiliza este método:

  • Si el destino no existe, entonces se copia la carpeta de origen y su contenido.
  • Si el destino ya existe, entonces se produce un error.
  • Si el destino es una carpeta, entonces se copiará la carpeta de origen y su contenido. Se producirá un error si Overwrite se establece en False y ya hay una copia de un archivo en el destino.
  • Si el destino se establece como de sólo lectura, se producirá un error si Overwrite se establece en False.

Este método se detiene en el primer error que encuentra. No hay reversión de ninguna acción que haya tenido éxito antes de que se produzca el error.

Usando los métodos ‘Move’

Estos métodos se pueden utilizar para mover archivos o carpetas a otras ubicaciones. Es lo mismo que cortar de una ubicación y pegar en otra. Tenga en cuenta que si el archivo que se va a mover está abierto, entonces el método Move fallará con un error.

MoveFile

Este método se utiliza para mover un archivo específico a otra ubicación. Se permiten comodines en el último componente de la ruta del origen.

La sintaxis es:

MoverArchivo origen, destino

Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub

Este código mueve todos los archivos que se encuentran en ‘C:\Ntemp’ a ‘C:\Ntemp\Nmi carpeta’.

Las carpetas de origen y destino deben existir, ya que la carpeta de destino no se crea automáticamente.

Este método se detiene en el primer error que encuentra. No hay reversión de ninguna acción que haya tenido éxito antes de que se produzca el error.

MoverCarpeta

Este método mueve una carpeta específica de una ubicación a otra.

La sintaxis es:

MoverCarpeta (origen, destino)

Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub

Este código mueve la carpeta ‘micarpeta’ y su contenido a la carpeta ‘midestino’.

Se elimina efectivamente ‘micarpeta’ y se crea ‘midestino’, junto con el contenido de ‘micarpeta’.

Si la carpeta de destino ya existe, se produce un error.

Uso de los métodos ‘Delete’

Estos métodos se utilizan para eliminar archivos o carpetas. Deben usarse con cuidado ya que no hay métodos de retroceso o deshacer si algo sale mal.

BorrarArchivo

Esto borra archivos individuales o un grupo de archivos usando comodines.

La sintaxis es:

DeleteFile filespec,

Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub

Este código borrará todos los archivos de la carpeta ‘C:\temp’

El parámetro Force es opcional y se establece en True o False. Si se establece como True, se eliminarán los archivos de sólo lectura. El valor predeterminado es False.

DeleteFolder

Este método borra una carpeta especificada y su contenido.

La sintaxis es:

DeleteFolder folderspec,

Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub

Este código borrará la carpeta ‘MyDestination’ y todos los archivos dentro de esa carpeta. La carpeta ‘temp’ permanecerá.

El parámetro Force es opcional y se establece como True o False. Si se establece como True, se eliminarán las carpetas de sólo lectura. El valor por defecto es False.

Se pueden utilizar comodines en el último componente de la ruta. Si no se encuentra la carpeta, se producirá un error.

Este método se detiene en el primer error que encuentra. No hay reversión de ninguna acción que haya tenido éxito antes de que se produzca el error.

Otros métodos en el FSO

OpenAsTextStream.

Este método abre un archivo especificado como un objeto Text Stream y permite leer o escribir en él. La ventaja de este método es que puede abrir cualquier tipo de archivo y extraer el texto disponible.

La sintaxis es:

OpenAsTextStream (])

El parámetro ‘iomode’ permite sólo lectura (1), lectura/escritura (2) y anexión (8). El parámetro de lectura/escritura sobrescribe el archivo.

El parámetro ‘format’ se establece en -2 para el sistema por defecto, -1 para abrir el archivo como Unicode, y 0 para abrir el archivo como ASCII (American Standard Code for Information Interchange).

Sub TextStream()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")Set ts = f.OpenAsTextStream(2)ts.Write "My new text"ts.CloseSet ts = f.OpenAsTextStream(1)s = ts.ReadLineMsgBox sts.CloseEnd Sub

Este código obtiene un archivo de texto existente y lo crea como un objeto utilizando el método ‘GetFile’. A continuación, abre el flujo de texto como lectura / escritura (2) y escribe una línea de texto. A continuación, se cierra el archivo y se vuelve a abrir como lectura (1) y se lee una línea de él, que luego se muestra como un cuadro de mensaje.

Tenga en cuenta que la línea leída debe colocarse en una variable antes de que pueda mostrarse en un cuadro de mensaje.

ConstruirRuta

Este método añadirá un nombre de carpeta o archivo al final de una ruta de carpeta existente. Esto sólo crea una cadena de texto y no crea realmente la nueva carpeta.

La sintaxis es:

BuildPath (path, name)

Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub

Esto mostrará ‘C:\temp\ANewFolder’. Sin embargo, si desea utilizar realmente esta carpeta, debe utilizar el método ‘CreateFolder’.

OpenTextFile

Este método permite abrir archivos y leer o escribir en ellos según los parámetros establecidos. Funciona de forma similar al método OpenAsTextStream.

La sintaxis es:

OpenTextFile (filename, ]])

El parámetro ‘iomode’ permite ForReading, ForWriting y ForAppending. El parámetro ForWriting sobrescribe el archivo.

El parámetro ‘create’ es un valor booleano. True significa que se creará un nuevo archivo si el nombre de archivo especificado no existe. False significa que no se creará ningún archivo si no se encuentra el nombre de archivo. El valor por defecto es False.

El parámetro ‘format’ puede establecerse como TristateFalse, TristateMixed, TristateTrue, y TristateUseDefault dependiendo de si el archivo es ASCII o Unicode.

Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub

Este código leerá una línea del archivo de texto ‘myfile.txt’.

Una ventaja que tiene el método OpenTextFile sobre el OpenAsTextStreamMethod es que tiene desplegables para los parámetros, que son más significativos que tratar de recordar los valores numéricos apropiados para las distintas opciones de los parámetros.

Propiedades del FSO

Drives

Esta propiedad contiene una colección de unidades disponibles en su ordenador.

Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub

Este código devolverá cada letra de unidad disponible en su ordenador.

Nombre

Devuelve el nombre de un archivo o carpeta especificado.

Sub NameExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub

Este código dará el nombre del archivo e información sobre el mismo utilizando la propiedad Drive.

Ruta

La propiedad Path separará la ruta de una especificación de archivo.

Sub PathExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Path & f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub

Este ejemplo funciona de la misma manera que el ejemplo de Name, excepto que ahora proporciona la ruta para el archivo.

Size

La propiedad Size dará el tamaño de una carpeta o un archivo.

Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub

Este código anterior devolverá el tamaño de la carpeta ‘C:\temp\’.

Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub

Este código anterior devolverá el tamaño del archivo ‘myfile.txt’.

Tipo

La propiedad tipo devolverá el texto del tipo de archivo o carpeta.

Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub

Este código de arriba devolverá el texto ‘Carpeta de archivos’.

Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub

Este código de arriba devolverá el texto ‘Documento de texto’.

Note el uso de ‘GetFolder’ y ‘GetFile’ en cada ejemplo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.