web-development-kb-es.site

Borrar un archivo en VBA

Usando VBA, ¿cómo puedo:

  1. probar si existe un archivo, y si es así,
  2. ¿bórralo?
107
inglesp

1.) Compruebe aquí . Básicamente haz esto:

Function FileExists(ByVal FileToTest As String) As Boolean
   FileExists = (Dir(FileToTest) <> "")
End Function

Le dejaré a usted que averigüe los diversos tipos de errores que se necesitan, pero estos son algunos de los aspectos de los que estaría considerando:

  • Compruebe si se pasa una cadena vacía.
  • Busque una cadena que contenga caracteres ilegales en un nombre de archivo/ruta

2.) Cómo eliminar un archivo. Mira esto. Básicamente, utilice el comando Kill, pero debe tener en cuenta la posibilidad de que un archivo sea de solo lectura. Aquí hay una función para ti:

Sub DeleteFile(ByVal FileToDelete As String)
   If FileExists(FileToDelete) Then 'See above          
      ' First remove readonly attribute, if set
      SetAttr FileToDelete, vbNormal          
      ' Then delete the file
      Kill FileToDelete
   End If
End Sub

Nuevamente, le dejaré el manejo del error y nuevamente estas son las cosas que consideraría:

  • ¿Debería esto comportarse de manera diferente para un directorio en lugar de un archivo? ¿Debería un usuario tener que indicar explícitamente que desea eliminar un directorio?

  • ¿Desea que el código restablezca automáticamente el atributo de solo lectura o se le debe dar al usuario algún tipo de indicación de que el atributo de solo lectura está establecido?


EDITAR: Marcar esta respuesta como wiki de la comunidad para que cualquiera pueda modificarla si es necesario.

149
Onorio Catenacci

Una forma alternativa de codificar la respuesta de Brettski, con la que estoy completamente de acuerdo, podría ser

With New FileSystemObject
    If .FileExists(yourFilePath) Then
        .DeleteFile yourFilepath
    End If
End With

Mismo efecto pero menos declaraciones de variables (bueno, ninguna en absoluto).

El FileSystemObject es una herramienta realmente útil y vale la pena ser amigable. Aparte de todo lo demás, la escritura de archivos de texto puede ser a veces más rápida que la alternativa heredada, lo que puede sorprender a algunas personas. (En mi experiencia al menos, YMMV).

49
Mike Woodhouse

Se puede usar lo siguiente para probar la existencia de un archivo y luego eliminarlo.

Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
     Kill aFile
End If 
10
Rich Adams

Probablemente me enojaré por esto, pero ¿cuál es el punto de la prueba de existencia si solo lo va a eliminar? Una de mis principales acciones de mascotas es una aplicación que muestra un cuadro de diálogo de error con algo como "No se pudo eliminar el archivo, ¡no existe!"

On Error Resume Next
aFile = "c:\file_to_delete.txt"
Kill aFile
On Error Goto 0
return Len(Dir$(aFile)) > 0 ' Make sure it actually got deleted.

Si el archivo no existe en primer lugar, ¡misión cumplida!

10
JohnFx

En VB es normalmente Dir para encontrar el directorio del archivo. Si no está en blanco, entonces existe y luego use Kill para deshacerse del archivo.

test = Dir(Filename)
If Not test = "" Then
    Kill (Filename)
End If
6
Leo Moore

establece una referencia a la biblioteca Scripting.Runtime y luego usa FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

if (fso.FileExists("PathToFile")) then
    aFile = fso.GetFile("PathToFile")
    aFile.Delete
End if
4
Brettski

Aquí hay una sugerencia: ¿está reutilizando el nombre del archivo o planea hacer algo que requiera la eliminación inmediata?

¿No?

Puede hacer que VBA ejecute el comando DEL "C:\TEMP\scratchpad.txt"/F desde el Indicador de comando asincrónicamente usando VBA.Shell:

Shell "DEL" & chr (34) & strPath & chr (34) & "/ F", vbOcultar

Tenga en cuenta las comillas dobles (carácter ASCII 34) alrededor del nombre de archivo: Supongo que tiene una ruta de red o un nombre de archivo largo que contiene espacios.

Si es un archivo grande, o está en una conexión de red lenta, disparar y olvidar es el camino a seguir. Por supuesto, nunca puedes ver si esto funcionó o no; pero reanuda su VBA inmediatamente, y hay momentos en que esto es mejor que esperar por la red.

3
Nigel Heffernan

Puede establecer una referencia a la biblioteca Scripting.Runtime y luego usar FileSystemObject. Tiene un método DeleteFile y un método FileExists.

Vea el artículo de MSDN aquí .

2
Darrel Miller