Usando FileSystemObject (FSO) en Excel VBA
FileSystemObject (FSO) le da acceso a una amplia gama de funciones para acceder al sistema de archivos de su computadora. Con este objeto, puede acceder fácilmente a archivos, carpetas y unidades, y también leer y escribir en archivos.
Muchas de las funciones de 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 comprender para un desarrollador entrante. El FSO es una API (Interfaz de programación de aplicaciones) probada y probada y es más confiable que su propio código. Es fácil de usar y está listo y disponible.
El FSO funciona según los estándares y configuraciones internacionales que tiene en su computadora. Si está distribuyendo su aplicación de Excel a nivel mundial, el uso de FSO se encargará de cualquier diferencia en la configuración entre países, lo que su propio código tendría problemas para hacer.
El FSO le permitirá hacer casi todo en código VBA que podría hacer en el Explorador de archivos de Windows. Le brinda acceso completo al sistema de archivos de Windows.
Creando un FileSystemObject
FileSytemObject no es parte de Excel VBA. Puede usar el FSO creando un objeto (enlace tardío) en VBA:
123 | Sub CreateFSO ()Establecer MyFSO = CreateObject ("Scripting.FileSystemObject")End Sub |
Alternativamente, puede agregar una referencia en VBA para la biblioteca FSO. Esto se llama enlace temprano y es más rápido que el enlace tardío, ya que no es necesario crear el objeto cuando se ejecuta el código.
Para agregar una referencia, debe presionar Alt-F11 para ingresar al Editor de Visual Basic (VBE) y luego usar "Herramientas | Referencias" en el menú VBE. Esto mostrará una ventana emergente para que seleccione la referencia relevante (ver más abajo).
Desplácese hacia abajo en la lista de referencias disponibles hasta que vea "Microsoft Scripting Runtime". Marque la casilla y haga clic en Aceptar, y la biblioteca ahora es 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 ubicaciones, es esencial que tengan este archivo en la ubicación correcta en su computadora, de lo contrario su código generará un error.
Vale la pena poner una trampa de error en el evento "WorkbookOpen" usando el comando Dir para verificar que el archivo existe. Si está ausente, envíe un mensaje de advertencia y cierre el archivo de Excel.
Una vez que se ha agregado la referencia, puede usar el siguiente código para crear el FSO:
123 | Prueba secundaria FSO ()Atenuar MyFSO como nuevo 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 de acuerdo con lo que pueden hacer.
Uso de los métodos "existentes"
Puede utilizar un método FSO para comprobar si existe una unidad, una carpeta o un archivo. Estos métodos son fáciles de usar y solo requieren un parámetro.
123456 | Sub CheckExistance ()Atenuar MyFSO como nuevo FileSystemObjectMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")End Sub |
Todas estas declaraciones devolverán "Verdadero" asumiendo que su computadora tiene una unidad C :, una carpeta llamada "Temp" y un archivo en la carpeta Temp llamado "testfile.txt"
Las cadenas de texto de los parámetros no distinguen entre mayúsculas y minúsculas. No puede utilizar comodines en ninguno de estos métodos.
Tampoco puede utilizar URL (localizadores uniformes de recursos) para describir la ubicación de una carpeta o archivo. El FSO funciona exclusivamente en el sistema operativo Windows y el sistema de archivos correspondiente. Para una ubicación de servidor externo, primero debe asignar una unidad a este y luego usar la ruta de la unidad.
Uso de 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 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)
12345 | Sub AbsolutePath ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadenaPth = "c:…"MsgBox MyFSO.GetAbsolutePathName (Pth)End Sub |
Esto devolverá una cadena "C: \ Users \ Richard \ Documents". Esto se debe a que la ruta se ha especificado como C: seguida de tres puntos. Cada punto significa un siguiente nivel dentro de la estructura de carpetas.
GetBaseName
Esto devuelve el nombre de un archivo o carpeta especificados.
La sintaxis es:
GetBaseName(sendero)
12345 | Sub BaseName ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadenaPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)End Sub |
Este código devolverá "archivo de prueba". El método devuelve la última sección del nombre de la ruta. Si es un archivo, entonces no devuelve el sufijo del archivo.
Si no se puede encontrar la ruta, se devolverá una cadena en blanco.
GetDrive
Esto le permite utilizar código para acceder a la información de la unidad, según la letra de unidad especificada.
La sintaxis es:
GetDrive (drivepec)
123456 | Sub DriveInfo ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadena, Dr como unidadPth = "C:"Establecer Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceEnd Sub |
Este método devuelve un objeto de unidad basado en la unidad especificada. Puede utilizar este objeto para acceder a información sobre la unidad, como el espacio libre disponible.
¿Cansado de buscar ejemplos de código VBA? ¡Prueba AutoMacro!
GetDriveName
Este método separará el nombre de la unidad de una cadena de ruta / nombre de archivo.
La sintaxis es:
GetDriveName (sendero)
12345 | Sub DriveName ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadenaPth = "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 (sendero)
12345 | Sub ExtensionName ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadenaPth = "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.
Obtener el archivo
Este método devuelve un objeto de archivo, que contiene información diversa sobre el archivo en sí.
La sintaxis es:
Obtener el archivo (especificaciónarchivo)
123456 | Sub FileInfo ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadena, Fn como archivoPth = "C: \ temp \ testfile.txt"Establecer 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 de "archivo no encontrado".
12345 | Sub nombre de archivo ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadenaPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)End Sub |
Esto devolverá "testfile.txt".
GetFolder
Esto crea un objeto de carpeta para la carpeta base en la ruta especificada. La ruta solo debe contener nombres de carpetas. No se deben incluir nombres de archivo, de lo contrario se producirá un error.
La sintaxis es:
GetFolder (folderpec)
123456 | Sub FolderInfo ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadena, Fo como carpetaPth = "C: \ temp"Establecer Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedEnd Sub |
El objeto de carpeta contiene diversa información a la que se puede acceder. En este caso, devuelve la fecha en que se creó la carpeta.
También puede utilizar este método para recuperar todos los nombres de archivo dentro de una carpeta determinada:
12345678 | Sub FileNames ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadena, Fo como carpeta, Fn como archivoPth = "C: \ temp"Establecer Fo = MyFSO.GetFolder (Pth)Para cada Fn en archivos fo.MsgBox Fn.NameSiguiente 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 en la jerarquía de carpetas.
La sintaxis es:
GetParentFolderName (sendero)
12345 | Nombre de subcarpeta ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadena, Fo como carpetaPth = "C: \ usuarios \ richard"MsgBox MyFSO.GetParentFolderName (Pth)End Sub |
Esto devolverá "Usuarios", ya que es el "padre" de la carpeta "richard".
Programación VBA | ¡Code Generator funciona para usted!
Uso de los métodos "Crear"
Con FSO puede crear una nueva carpeta y ruta y crear un archivo de texto.
Crear carpeta
Puede especificar un nuevo nombre de ruta de carpeta para crear. Un peligro de esto es que si la carpeta ya existe, se producirá un error. Puede utilizar el método "FolderExists" para asegurarse de que esto no suceda.
La sintaxis es:
Crear carpeta(nombre de la carpeta)
1234567 | Sub CreateNewFolder ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadenaPth = "C: \ temp \ MyFolder"Si MyFSO.FolderExists (Pth) = False EntoncesMyFSO.CreateFolder (Pth)Terminara siEnd Sub |
Este código creará una nueva carpeta llamada "MyFolder" bajo la ruta existente "C: \ temp".
CreateTextFile
Este método le permite crear un archivo de texto simple y escribir directamente en él.
La sintaxis es:
CreateTextFile (nombre del archivo, [ Sobrescribir, [ Unicode ]])
1234567 | Sub CreateTextFile ()Atenuar MyFSO como nuevo FileSystemObject, Pth como cadenaPth = "C: \ temp \ Myfile.txt"Establecer Fn = MyFSO.CreateTextFile (Pth, True)Fn.Escribe "Agregar mi propio texto aquí" & vbLf & "Esta es la segunda línea"Fn.CerrarEnd Sub |
Este código crea un archivo de texto llamado "Myfile.txt" en la carpeta "Temp" de la unidad "C:" y luego escribe dos líneas de texto en él.
Tenga en cuenta que un carácter de avance de línea está concatenado en la cadena que se está escribiendo.
Si la ruta en la que está escribiendo no existe, se producirá un error. Puede utilizar el método "FolderExists" para comprobar esto antes de crear el archivo.
Existe un parámetro opcional para sobrescribir el archivo existente si es necesario; puede ser Verdadero o Falso. El defecto es cierto.
Uso de los métodos "Copiar"
Puede utilizar estos métodos para copiar un archivo o una carpeta a otra ubicación.
Programación VBA | ¡Code Generator funciona para usted!
Copiar archivo
Este método copiará un archivo de una carpeta a otra. Tenga en cuenta que la copia fallará si la ubicación de destino tiene establecido el atributo de solo lectura.
La sintaxis es:
Copiar archivo fuente, destino, [ Sobrescribir ]
1234 | Sub CopyFile ()Atenuar MyFSO como nuevo FileSystemObjectMyFSO.CopyFile "C: \ temp \ *. Txt", "C: \ temp \ myfolder \", VerdaderoEnd Sub |
Este código hará una copia de todos los archivos de texto (txt) en "C: \ temp" en "C: \ temp \ myfolder \", sobrescribiendo el archivo cuando sea necesario. La configuración predeterminada para Sobrescribir es Verdadero.
Puede usar un comodín de asterisco (*) para los nombres de archivo, pero no puede usar un comodín de signo de interrogación (?) Para representar caracteres individuales.
CopyFolder
Puede utilizar este método para copiar una carpeta completa de una ubicación a otra.
La sintaxis es:
CopyFolder fuente, destino, [ Sobrescribir ]
1234 | Sub CopyFolder ()Atenuar MyFSO como nuevo FileSystemObjectMyFSO.CopyFolder "C: \ temp \ *", "C: \ users \ richard \"End Sub |
Este código copia todas las carpetas y archivos 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 llamada "myfolder".
Hay cuatro posibles resultados al utilizar este método:
- Si el destino no existe, se copian la carpeta de origen y el contenido.
- Si el destino ya existe, se produce un error.
- Si el destino es una carpeta, se copiará la carpeta de origen y su contenido. Se producirá un error si Sobrescribir se establece en Falso y ya hay una copia de un archivo en el destino.
- Si el destino se establece en solo lectura, se producirá un error si la sobrescritura se establece en falso.
Este método se detiene en el primer error que encuentra. No hay reversión de ninguna acción que se haya realizado correctamente antes de que se produzca el error.
Uso de los métodos "Move"
Estos métodos se pueden utilizar para mover archivos o carpetas a otras ubicaciones. Esto es lo mismo que cortar desde una ubicación y pegar en otra ubicación. Tenga en cuenta que si el archivo que se va a mover está abierto, 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 ruta de la fuente.
La sintaxis es:
MoveFile fuente, destino
1234 | Sub MoveAFile ()Atenuar MyFSO como nuevo FileSystemObjectMyFSO.MoveFile "C: \ temp \ *", "C: \ temp \ myfolder"End Sub |
Este código mueve todos los archivos que se encuentran en "C: \ temp" a "C: \ temp \ myfolder".
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 se haya realizado correctamente antes de que se produzca el error.
Programación VBA | ¡Code Generator funciona para usted!
MoveFolder
Este método mueve una carpeta específica de una ubicación a otra.
La sintaxis es:
MoveFolder (fuente, destino)
1234 | Sub MoveAFolder ()Atenuar MyFSO como nuevo FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"End Sub |
Este código mueve la carpeta "myfolder" y el contenido a la carpeta "mydestination". "Myfolder" se elimina de forma efectiva y se crea "mydestination", junto con el contenido de "myfolder".
Si la carpeta de destino ya existe, se produce un error.
Uso de los métodos "Eliminar"
Estos métodos se utilizan para eliminar archivos o carpetas. Deben usarse con cuidado, ya que no hay métodos para deshacer o deshacer si algo sale mal.
Borrar archivo
Esto elimina archivos individuales o un grupo de archivos usando comodines.
La sintaxis es:
Borrar archivo especificaciónarchivo, [ fuerza ]
1234 | Sub DeleteFiles ()Atenuar MyFSO como nuevo FileSystemObjectMyFSO.DeleteFile "C: \ temp \ *"End Sub |
Este código eliminará todos los archivos de la carpeta "C: \ temp"
El parámetro Force es opcional y se establece en True o False. Si se establece en Verdadero, se eliminarán los archivos de solo lectura. El valor predeterminado es falso.
Eliminar carpeta
Este método elimina una carpeta específica y su contenido.
La sintaxis es:
Eliminar carpeta folderpec, [ fuerza ]
1234 | Sub DeleteFolders ()Atenuar MyFSO como nuevo FileSystemObjectMyFSO.DeleteFolder "C: \ temp \ MyDestination"End Sub |
Este código eliminará la carpeta "MyDestination" y todos los archivos dentro de esa carpeta. La carpeta "temp" permanecerá.
El parámetro Force es opcional y se establece en True o False. Si se establece en Verdadero, se eliminarán las carpetas de solo lectura. El valor predeterminado es falso.
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 se haya realizado correctamente antes de que se produzca el error.
Programación VBA | ¡Code Generator funciona para usted!
Otros métodos en el FSO
OpenAsTextStream.
Este método abre un archivo especificado como un objeto Text Stream y permite leerlo o escribirlo. La ventaja de este método es que puede abrir cualquier tipo de archivo y extraer el texto disponible.
La sintaxis es:
OpenAsTextStream ([ iomode, [ formato ]])
El parámetro "iomode" permite solo lectura (1), lectura / escritura (2) y anexos (8). El parámetro de lectura / escritura sobrescribe el archivo.
El parámetro "formato" se establece en -2 para el sistema predeterminado, -1 para abrir el archivo como Unicode y 0 para abrir el archivo como ASCII (Código estándar americano para el intercambio de información).
1234567891011 | Sub TextStream ()Atenuar MyFSO como nuevo FileSystemObjectEstablecer f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Establecer ts = f.OpenAsTextStream (2)ts.Escribe "Mi nuevo texto"ct CerrarEstablecer ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sct CerrarEnd Sub |
Este código obtiene un archivo de texto existente y lo crea como un objeto utilizando el método "GetFile". Luego abre el flujo de texto como lectura / escritura (2) y escribe una línea de texto. Luego, el archivo se cierra y se vuelve a abrir como leído (1) y se lee una línea, que luego se muestra como un cuadro de mensaje.
Tenga en cuenta que la línea de lectura debe colocarse en una variable antes de que pueda mostrarse en un cuadro de mensaje.
Construir camino
Este método agregará un nombre de carpeta o archivo al final de una ruta de carpeta existente. Esto solo crea una cadena de texto y en realidad no crea la nueva carpeta.
La sintaxis es:
Construir camino (sendero, nombre)
12345 | Sub BuildPth ()Atenuar MyFSO como nuevo FileSystemObjectnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npEnd Sub |
Esto mostrará "C: \ temp \ ANewFolder". Sin embargo, si realmente desea utilizar esta carpeta, debe utilizar el método "CreateFolder".
OpenTextFile
Este método permite abrir y leer o escribir archivos de acuerdo con los parámetros establecidos. Funciona de forma similar al método OpenAsTextStream.
La sintaxis es:
OpenTextFile (nombre del archivo, [ iomode, [ crear, [ formato ]]])
El parámetro "iomode" permite ForReading, ForWriting y ForAppending. El parámetro ForWriting sobrescribe el archivo.
El parámetro "crear" es un valor booleano. Verdadero significa que se creará un nuevo archivo si el nombre de archivo especificado no existe. Falso significa que no se creará ningún archivo si no se encuentra el nombre del archivo. El valor predeterminado es falso.
El parámetro "formato" se puede establecer en TristateFalse, TristateMixed, TristateTrue y TristateUseDefault, dependiendo de si el archivo es ASCII o Unicode.
1234567 | Sub OpenTxtFile ()Atenuar MyFSO como nuevo FileSystemObjectEstablecer ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sct CerrarEnd Sub |
Este código leerá una línea del archivo de texto "myfile.txt".
Una ventaja que tiene el método OpenTextFile sobre OpenAsTextStreamMethod es que tiene menús desplegables para los parámetros, que son más significativos que tratar de recordar los valores numéricos apropiados para las diversas opciones de parámetros.
Programación VBA | ¡Code Generator funciona para usted!
Propiedades del FSO
Drives
Esta propiedad contiene una colección de unidades disponibles en su computadora.
1234567 | Sub Drv ()Atenuar MyFSO como nuevo FileSystemObject, d como unidadEstablecer Dr = MyFSO.DrivesPara cada d en Dr.MsgBox d.DriveLetterSiguiente dEnd Sub |
Este código devolverá cada letra de unidad disponible en su computadora.
Nombre
Esto devuelve el nombre de un archivo o carpeta especificados.
123456789 | Sub nombreEjemplo ()Atenuar MyFSO como nuevo FileSystemObjectEstablecer f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Name & "en la unidad" & UCase (f.Drive) & vbCrLfi = i & "Created:" & f.DateCreated & vbCrLfi = i & "Último acceso:" & f.DateLastAccessed & vbCrLfi = i & "Última modificación:" & f.DateLastModifiedMsgBox iEnd Sub |
Este código le dará el nombre del archivo e información sobre él usando la propiedad Drive.
Sendero
La propiedad Path separará la ruta de una especificación de archivo.
123456789 | Sub PathExample ()Atenuar MyFSO como nuevo FileSystemObjectEstablecer f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "en la unidad" & UCase (f.Drive) & vbCrLfi = i & "Created:" & f.DateCreated & vbCrLfi = i & "Último acceso:" & f.DateLastAccessed & vbCrLfi = i & "Última modificación:" & f.DateLastModifiedMsgBox iEnd Sub |
Este ejemplo funciona de la misma manera que el ejemplo de Nombre, excepto que ahora proporciona la ruta del archivo.
Programación VBA | ¡Code Generator funciona para usted!
Tamaño
La propiedad Tamaño dará el tamaño de una carpeta o un archivo.
12345 | Sub FSize ()Atenuar MyFSO como nuevo FileSystemObjectEstablecer f = MyFSO.GetFolder ("C: \ temp \")MsgBox f. TamañoEnd Sub |
Este código anterior devolverá el tamaño de la carpeta "C: \ temp \".
12345 | Sub FSize ()Atenuar MyFSO como nuevo FileSystemObjectEstablecer f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f. TamañoEnd Sub |
Este código anterior devolverá el tamaño del archivo "myfile.txt".
Escribe
La propiedad de tipo devolverá el texto del tipo de archivo o carpeta.
12345 | Sub FType ()Atenuar MyFSO como nuevo FileSystemObjectEstablecer f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TypeEnd Sub |
Este código anterior devolverá el texto "Carpeta de archivos".
12345 | Sub FType ()Atenuar MyFSO como nuevo FileSystemObjectEstablecer f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TypeEnd Sub |
Este código anterior devolverá el texto "Documento de texto".
Tenga en cuenta el uso de "GetFolder" y "GetFile" en cada ejemplo.