Objeto del sistema de archivos en VBA

Iqra Hasnain 15 febrero 2024
  1. Objeto del sistema de archivos en VBA
  2. Creación de FileSystemObject en VBA
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:

Usar el objeto del sistema de archivos para verificar que la carpeta exista o no en VBA

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:

Uso del objeto del sistema de archivos para verificar el archivo dentro de una carpeta en VBA

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:

Uso del objeto del sistema de archivos para crear una nueva carpeta en VBA

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:

Uso del objeto del sistema de archivos para crear una nueva carpeta en VBA

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:

verificando los nombres de archivo de la carpeta usando el objeto del sistema de archivos en VBA

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:

verificando los nombres de las subcarpetas de la carpeta usando el objeto del sistema de archivos en VBA

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 src para transferir archivos de src a dst usando el objeto del sistema de archivos en VBA

Carpeta Dst:

carpeta dst después de transferir archivos de src a dst usando el objeto del sistema de archivos en VBA

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