Objeto del sistema de archivos en VBA
Presentaremos el Objeto del sistema de archivos
en VBA con ejemplos.
Objeto del sistema de archivos en VBA
El FileSystemObject
(FSO) proporciona una variedad de operaciones para acceder al sistema de archivos de la computadora portátil. Este objeto nos permite acceder rápidamente a archivos, directorios y unidades y leer y escribir en ellos.
El FSO opera de acuerdo con los estándares mundiales y la configuración del sistema. Si compartimos la aplicación de Excel internacionalmente, el FSO manejará cualquier variación en la configuración entre países que el código de uno pueda tener dificultades para manejar.
El FSO nos permitirá realizar prácticamente todo lo que puede hacer en Windows File Explorer en código VBA. De hecho, ofrece control total sobre el sistema de archivos de Windows.
Creación de FileSystemObject
en VBA
Excel VBA no incluye el FileSystemObject
. Tal vez, podríamos usar FSO en VBA construyendo un objeto de enlace tardío.
Código:
# vba
Sub CreateFileSysObj()
Set MyFileSysObj = CreateFileSysObj("Scripting.FileSystemObject")
End Sub
También podemos incluir una referencia a la biblioteca FSO en VBA. El enlace anticipado es más rápido que el enlace tardío porque no es necesario generar el objeto cuando se ejecuta el código.
Para agregar un enlace, abra el Editor de Visual Basic (VBE) presionando Alt-F11, luego seleccione 'Herramientas|Referencias'
en el menú de VBE. Esto puede abrir una ventana emergente donde podemos elegir la referencia adecuada.
Desplácese hacia abajo hasta encontrar 'Microsoft Scripting Runtime'
dentro de la columna de referencias accesibles. Seleccione la casilla y haga clic en Aceptar para incluir la biblioteca en la aplicación.
El archivo de la biblioteca DLL se encuentra en C:Windows\SysWOW64\scrrun.dll
.
Si estamos enviando el programa a otros compañeros de trabajo o lugares, asegúrese de que tengan este archivo en el lugar correcto en su PC, o el código fallará. Se recomienda usar el comando Dir
para verificar que el archivo existe en una trampa de error en el evento WorkbookOpen
.
Si falta, muestre un mensaje y salga del archivo de Excel. Después de haber insertado la referencia, podemos generar el FSO con el siguiente código.
Código:
# vba
Sub TestFileSysObj()
Dim MyFileSysObj As New FileSystemObject
End Sub
El siguiente código determinará si existe o no la carpeta llamada 'Test'
(en la ubicación particular). Si la carpeta está allí, la condición IF es “True” y el cuadro de mensaje muestra “‘La carpeta existe’”. Si no existe, aparece el texto “‘La carpeta no existe’”.
Código:
# vba
Sub FolderExistCheck()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.FolderExists("D:\Test") Then
MsgBox"This Folder Exists"
Else
MsgBox"This Folder Doest Not Exists"
End If
End Sub
Producción:
Del mismo modo, podemos determinar si existe o no un archivo. El siguiente código determina si existe o no un archivo llamado Test.xlsx
en la carpeta proporcionada.
Código:
# VBA
Sub CheckFileExist()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.FileExists("D:\Test\Test.xlsx") Then
MsgBox "This File Exists In Folder"
Else
MsgBox "This File Does Not Exist In Folder"
End If
End Sub
Producción:
El siguiente código creará una carpeta llamada 'Test'
en el disco C de nuestro sistema (tendremos que proporcionar la ruta en nuestra computadora donde nos gustaría crear la carpeta).
Código:
# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
MyFileSysObj.CreateFolder("D:\Test")
End Sub
Producción:
Si bien este código funciona bien, generará una excepción si la carpeta ya existe. El siguiente código comprueba si la carpeta ya existe y, si no, crea una.
Muestra una notificación si la carpeta ya existe. Utilizamos el método Folder Exists de FSO para determinar si la carpeta existe.
Código:
# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.CreateFolder("D:\Test") Then
MsgBox "This Folder Exists Already"
Else
MyFileSysObj.CreateNewFolder("D:\Test")
End If
End Sub
Producción:
El siguiente código copia todos los archivos de la carpeta raíz a la carpeta especificada.
Código:
# vba
Sub FetchFileName()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim FileInFolder
Dim SysFolder
Set SysFolder = MyFileSysObj.GetFolder("D:\Test")
For Each FileInFolder In SysFolder.Files
Debug.Print FileInFolder.Name
Next FileInFolder
End Sub
Producción:
Este ejemplo es más complejo que los que ya hemos comentado antes. Cuando nos referimos a la Biblioteca de tiempo de ejecución de secuencias de comandos de Microsoft
, podemos usar FileSystemObject
y todos los demás objetos de archivos y carpetas.
Como se mencionó en el ejemplo anterior, hemos utilizado tres objetos: FileSystemObject
, File y Folder
. Esto nos permite revisar cada archivo en la carpeta requerida, y usamos la propiedad de nombre para obtener la lista de todos los nombres de archivo.
Tenga en cuenta que estamos usando Debug.Print
para obtener los nombres de todos los archivos. Vayamos a otro ejemplo en el que daremos los nombres de todas las subcarpetas en la carpeta requerida.
La idea será la misma que la discutida en los ejemplos anteriores. En lugar de archivos, en estos ejemplos, usaremos las subcarpetas.
Código:
# vba
Sub FetchSubFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim FileInFolder
Dim SysFolder
Dim SysSubFolder
Set SysFolder = MyFileSysObj.GetFolder("D:\Test")
For Each SysSubFolder In SysFolder.SubFolders
Debug.Print SysSubFolder.Name
Next SysSubFolder
End Sub
Producción:
Analicemos otro ejemplo en el que sobrescribiremos archivos, como se muestra a continuación.
Código:
# vba
Sub CopyFiles()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim SysFile
Dim SrcFolder
Dim FinalFolder
Dim SysFolder
Dim SysSubFolder
SrcFolder = "D:\Test\Src"
FinalFolder = "D:\Test\Dst"
Set SysFolder = MyFileSysObj.GetFolder(SrcFolder)
For Each SysFile In SysFolder.Files
MyFileSysObj.CopyFile Source:=MyFileSysObj.GetFile(SysFile), _
Destination:=FinalFolder & "\" & SysFile.Name, Overwritefiles:=False
Next SysFile
End Sub
Producción:
Carpeta origen
:
Carpeta Dst
:
Tenga en cuenta que establecemos la propiedad Overwritefiles
en False
en la función MyFileSysObj.CopyFile
(esto es verdadero por defecto). Esto asegura que el archivo no se duplique si ya existe en la carpeta (y observaremos un error).
Quizás, si establecemos esto en Verdadero o eliminamos Sobrescribir archivos
, se reescribirán todos los archivos en la carpeta final con el nombre exacto. Al transferir archivos, siempre existe el riesgo de sobrescribirlos.
En este escenario, es una buena idea proporcionar la marca de tiempo junto con el nombre. Esto garantiza que los nombres de los archivos sean siempre únicos y que podamos rastrear qué archivos se copiaron y cuándo.
Si solo queremos replicar archivos con una extensión específica, use una declaración SI y luego
para probar si la extensión es de un archivo de Excel de hoja de cálculo de Microsoft o no.
Código:
# vba
Sub CopyXlFiles()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim SysFile
Dim SrcFolder
Dim FinalFolder
Dim SysFolder
Dim SysSubFolder
SrcFolder = "D:\Src"
FinalFolder = "D:\Dst"
Set SysFolder = MyFileSysObj.GetFolder(SRCFolder)
For Each SysFile In SysFolder.Files
If MyFileSysObj.GetExtensionName(SysFile) = "xlsx" Then
MyFileSysObj.CopyFile Source:=MyFileSysObj.GetFile(SysFile), _
Destination:=FinalFolder & "\" & SysFile.Name, Overwritefiles:=False
End If
Next SysFile
End Sub