El uso de VBA, ¿cómo puede I:Eliminación de un archivo en VBA
- comprobar si existe un archivo, y si es así,
- eliminarla?
El uso de VBA, ¿cómo puede I:Eliminación de un archivo en VBA
1.) Compruebe here. Básicamente hacer esto:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Lo dejo a usted para averiguar los distintos gestión de errores es necesario, pero estas son algunas de las cosas de tratamiento de errores que estaría considerando:
2.) ¿Cómo borrar un archivo. Mire this. Básicamente use el comando Kill pero necesita permitir la posibilidad de que un archivo sea de solo lectura. Esto es una función para usted:
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
Una vez más, voy a dejar el manejo de errores a que una y otra vez estas son las cosas que yo consideraría:
Si esto comportarse de manera diferente para un directorio vs . ¿un archivo? ¿Debería un usuario tener que indicar explícitamente que quiere eliminar un directorio?
¿Desea que el código restablezca automáticamente el atributo de solo lectura o debería darse al usuario algún tipo de indicación de que está configurado el atributo de solo lectura?
EDIT: Marcado esta respuesta como wiki de la comunidad por lo que cualquiera puede modificarlo si es necesario.
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
Lo siguiente se puede utilizar para probar la existencia de un archivo y luego para eliminarlo.
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
Sé que esta pregunta y respuesta son antiguas, simplemente pensé que agregaría que usar Len() para probar cadenas (y funciones que devuelven cadenas) parece ser más rápido que las comparaciones de cadenas literales en VBA. – JimmyPena
La razón por la cual 'Len()' (y 'LenB()', que es aún más rápido) son más rápidos que la comparación de cadenas es que en la memoria, las cadenas de VB están precedidas por su longitud. Len/LenB simplemente extraen la longitud de esa ubicación de memoria, no tienen que iterar a través de la cadena para conocer su longitud. Por otro lado, el uso de la comparación de cadenas tiene mucho más trabajo por hacer. Además, evite usar '" "' en VB ya que siempre asigna una nueva cadena. Use 'vbNullString' en su lugar ya que es una constante y no usa más memoria. –
Puede establecer una referencia a la biblioteca Scripting.Runtime y luego usar FileSystemObject. Tiene un método DeleteFile y un método FileExists.
Consulte el artículo de MSDN here.
Probablemente me llame la atención por esto, pero ¿de qué sirve probar si solo quieres borrarlo? Una de mis principales preocupaciones es una aplicación que arroja un cuadro de diálogo de error con algo así 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!
Usted plantea un buen punto, pero, como la mayoría de las cosas, creo que dependerá del contexto y, a veces, simplemente tiene una función de "archivo existente" aparte de la eliminación. –
+1: tal vez el usuario de la aplicación quiera que se le pregunte antes de eliminar un archivo: por ejemplo, al usar 'ActiveWorkbook.SaveCopyAs' no se puede sobrescribir, por lo que primero debe eliminar el archivo existente con el mismo nombre de archivo. –
pero nunca debe usar 'On Resume Resume Next', o eso me han dicho: D Por supuesto, eso es un consejo ridículo, y su respuesta es correcta. –
establecer una referencia a la biblioteca Scripting.Runtime y luego utilizar el FileSystemObject:
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if
Utilizo el método FileSystemObject también, ya que Kill no puede eliminar archivos/carpetas con diacritis –
Una forma alternativa de codificar la respuesta de Brettski, con la que de otro modo totalmente de acuerdo, podría ser
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
Mismo efecto pero menos (bueno, nada en absoluto) declaraciones variables.
FileSystemObject es una herramienta realmente útil y vale la pena familiarizarse con ella. Aparte de todo lo demás, para la escritura de archivos de texto en realidad puede ser más rápido que la alternativa heredada, lo que puede sorprender a algunas personas. (En mi experiencia al menos, YMMV).
Usando esta sintaxis sin declarar un objeto de creación de scripts de archivos, debe agregar referencia para Microsoft Scripting Runtime, else: Dim fs As New Scripting.FileSystemObject – pghcpa
también necesita hacer referencia a la biblioteca de scripts. ver aquí: http://stackoverflow.com/questions/3233203/how-do-i-use-filesystemobject-in-vba – ekkis
Dado que no hay ninguna variable para establecer en Nothing, ¿existe un riesgo de que FileSystemObject permanezca en la memoria, causando una fuga u otro problema? –
Aquí hay un consejo: ¿está volviendo a utilizar el nombre del archivo, o está planeando hacer algo que requiere la eliminación de inmediato?
¿No?
Puede obtener VBA para disparar el comando DEL "C: \ TEMP \ scratchpad.txt"/F de la línea de comandos de forma asíncrona usando VBA.Shell:
Shell "DEL" & CHR (34) & strPath & CHR (34) & "/ F", vbHide
Nota las comillas dobles (caracteres ASCII 34) alrededor del nombre de archivo: Asumo que tienes una ruta de red, o una larga nombre de archivo que contiene espacios.
Si se trata de un archivo grande o de una conexión de red lenta, ignórelo es el camino a seguir. Por supuesto, nunca se puede ver si esto funcionó o no; pero reanuda su VBA inmediatamente, y hay momentos en que esto es mejor que esperar a la red.
Esta es una gran alternativa, * si * asynch es lo que quieres. –
gracias, ¿qué pasa si hay dos archivos con el mismo nombre que existirán si el subproceso DeleteFile los mata a ambos o solo a uno? cualquier consejo muy apreciado. – BKSpurgeon
No puede tener dos archivos con el mismo nombre en un directorio. –
brillante por supuesto! – BKSpurgeon