HOWTO · VBA

Cómo eliminar un archivo en VBA

Aprenda a eliminar con VBA un archivo, archivos por extensión o una carpeta vacía.

En esta página

Use la instrucción Kill de VBA para eliminar un archivo o los archivos coincidentes. Para un solo archivo, FileSystemObject ofrece el método DeleteFile y el método FileExists para comprobar primero su ruta. Use RmDir para eliminar una carpeta vacía. Elija la sección para su tarea y verifique la ruta y los archivos de destino antes de ejecutar el código de eliminación; estas operaciones eliminan archivos o carpetas.

Eliminar archivo en VBA

El enfoque correcto depende de lo que necesite eliminar. Kill es una instrucción de VBA que acepta una ruta de archivo o un patrón con comodines. FileSystemObject es un modelo de objetos separado para trabajar con archivos y carpetas; sus miembros DeleteFile y FileExists admiten la eliminación y las comprobaciones de rutas. RmDir elimina una carpeta vacía. Son opciones distintas, por lo que Kill no es una función de FileSystemObject.

Antes de adaptar un ejemplo, reemplace su ruta de ejemplo por la ruta completa que pretende usar. Compruebe cuidadosamente la carpeta y el nombre del archivo. Un comodín puede abarcar varios archivos de esa carpeta, así que inspeccione las coincidencias previstas antes de ejecutar código de eliminación masiva. Los fragmentos de VBA siguientes son ejemplos de sintaxis, no pruebas de tiempo de ejecución de Windows/VBA: la evidencia de ejecución proporcionada cubre solo la ilustración del sistema de archivos en PowerShell y no contiene ningún resultado observado para un host de VBA.

Eliminar un solo archivo en VBA

La instrucción Kill es una opción breve para un archivo conocido. Este procedimiento completo elimina el libro en la ruta especificada cuando se ejecuta en un host de VBA:

Sub DeleteFileWithKill(): Kill "D:\Test\testFile.xlsx": End Sub

Reemplace la ruta de ejemplo por el archivo exacto que pretende eliminar. Kill no pide confirmación, así que compruebe la ruta antes de ejecutarlo. El ejemplo supone que el archivo existe; si no existe, Kill produce un error de tiempo de ejecución de VBA. Agregue un control de errores deliberado si el procedimiento debe tratar un archivo ausente como un resultado normal.

También puede eliminar un archivo mediante FileSystemObject. Cree el objeto, establezca la ruta y llame a su método DeleteFile:

Sub DeleteFileWithFSO(): Dim FileSysObj As Object: Dim FileToDel As String: Set FileSysObj = CreateObject("Scripting.FileSystemObject"): FileToDel = "D:\Test\testFile.xlsx": FileSysObj.DeleteFile FileToDel, True: End Sub

El segundo argumento, True, permite eliminar un archivo de solo lectura. Cámbielo a False si quiere conservar los archivos de solo lectura. Este ejemplo de enlace tardío usa CreateObject, por lo que no requiere agregar una referencia de proyecto a Scripting Runtime.

Cuando el archivo puede estar ausente, compruébelo con FileExists antes de llamar a DeleteFile. El siguiente procedimiento muestra un mensaje para cualquiera de los dos resultados y omite la eliminación cuando la ruta no se encuentra:

Sub DeleteFileAfterChecking()
Dim FileSysObj As Object
Dim FileToDelete As String
Set FileSysObj = CreateObject("Scripting.FileSystemObject")
FileToDelete = "D:\Test\testFile.xlsx"
If FileSysObj.FileExists(FileToDelete) Then
FileSysObj.DeleteFile FileToDelete, True
MsgBox "File Deleted"
Else
MsgBox "There is no file with the name you provided!"
End If
End Sub

FileExists comprueba la ruta antes de que el procedimiento llame a DeleteFile; no impide que otro proceso cambie el archivo entre esas operaciones. Si necesita manejar fallos de acceso o de eliminación, agregue el control de errores adecuado para su libro en lugar de suponer que la comprobación garantiza la eliminación.

Este fixture de PowerShell independiente demuestra cómo crear y eliminar un archivo temporal. Es una ilustración del sistema de archivos, no código VBA ni evidencia del comportamiento en un host de Office.

$path = Join-Path ([System.IO.Path]::GetTempPath()) ("vba-delete-demo-" + [guid]::NewGuid().ToString() + ".txt")
Set-Content -LiteralPath $path -Value "sample"
Remove-Item -LiteralPath $path

Eliminar todos los archivos de texto en VBA

Para eliminar archivos de texto de una carpeta, use una ruta con comodines. D:\Test\Dst\*.txt coincide con los archivos .txt directamente en esa carpeta; no busca en subcarpetas. Este procedimiento completo pasa ese patrón a Kill:

Sub DeleteTxtFile(): Kill "D:\Test\Dst\*.txt": End Sub

Revise la carpeta y los nombres de archivo coincidentes antes de ejecutar el procedimiento. Cada archivo de texto coincidente es un objetivo. El patrón no busca en subcarpetas. Si la carpeta no contiene ningún archivo .txt coincidente, Kill produce un error de tiempo de ejecución de VBA, así que compruebe el conjunto de coincidencias o agregue control de errores cuando ese sea un estado posible. Reduzca el directorio o cambie la extensión solo después de confirmar el conjunto previsto, y mantenga los archivos no relacionados fuera de la carpeta seleccionada cuando sea posible. Estos resultados siguen la semántica de operación documentada de VBA; no se observó ningún resultado de ejecución de Windows/VBA para este ejemplo.

Eliminar todos los archivos de Excel en VBA

Para abarcar libros .xlsx en una carpeta, use la ruta con comodines correspondiente. El procedimiento completo abarca los libros coincidentes directamente en esa carpeta, no todos los libros de un árbol de directorios:

Sub DeleteXlFile(): Kill "D:\Test\Dst\*.xlsx": End Sub

Compruebe la carpeta y los nombres de los libros coincidentes antes de ejecutar esta eliminación masiva. El patrón .xlsx no incluye otros formatos de Excel como .xls o .xlsm; use un patrón separado y deliberado si esos formatos también están previstos. Mantenga el directorio reducido para que el comodín seleccione solo los archivos que quiere eliminar. Como con el patrón de archivos de texto, si ningún libro coincide, Kill produce un error de tiempo de ejecución de VBA; este comportamiento se describe a partir de la semántica de VBA y no se ejercitó en la evidencia de tiempo de ejecución proporcionada.

Eliminar una carpeta en VBA

Use RmDir para eliminar una carpeta que esté vacía. Este procedimiento completo nombra el directorio de ejemplo:

Sub DeleteFolder(): RmDir "D:\Test\Dst": End Sub

RmDir no elimina de forma recursiva los archivos o subcarpetas dentro de una carpeta no vacía. Requiere una carpeta vacía; llamarlo mientras queden archivos o subcarpetas produce un error de tiempo de ejecución de VBA. Mueva o elimine su contenido por separado y luego llame a RmDir para la carpeta en sí. Verifique que la ruta nombra el directorio previsto antes de ejecutar el procedimiento. Este es el comportamiento documentado de VBA, pero no se observó ningún resultado de tiempo de ejecución de Windows/VBA para una llamada con carpeta vacía o no vacía.