ruta - Eliminar un archivo en VBA
macro para obtener ruta de un archivo (9)
Usando VBA, ¿cómo puedo:
- probar si existe un archivo, y si es así,
- ¿bórralo?
1.) Marque here . Básicamente haz esto:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Dejaré que te des cuenta de los diversos manejos de errores necesarios, pero estos son algunos de los errores que manejaría las cosas que estaría considerando:
- Verifique que se haya pasado una cadena vacía.
- Busca una cadena que contenga caracteres ilegales en un nombre de archivo / ruta
2.) Cómo eliminar un archivo. Mira this. Básicamente, use 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
Una vez más, dejaré que te traten los errores y nuevamente estas son las cosas que consideraría:
¿Debería 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 el atributo de solo lectura está configurado?
EDITAR: Marca esta respuesta como wiki de la comunidad para que cualquiera pueda modificarla si es necesario.
2 líneas de código en VBA ..
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FileExists(strPath) Then FSO.DeleteFile ("" & strPath & "")
Aquí hay un consejo: ¿está volviendo a utilizar el nombre del archivo o planea hacer algo que requiere la eliminación de inmediato?
¿No?
Puede hacer que VBA dispare el comando DEL "C: / TEMP / scratchpad.txt" / F desde el símbolo del sistema asincrónicamente usando VBA.Shell:
Shell "DEL" y chr (34) y strPath & chr (34) y "/ F", vbHide
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 se trata de 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 a la red.
En VB normalmente es Dir
para encontrar el directorio del archivo. Si no está en blanco, entonces existe y luego usa Kill
para deshacerse del archivo.
test = Dir(Filename)
If Not test = "" Then
Kill (Filename)
End If
Lo siguiente se puede usar 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
Probablemente me llame la atención por esto, pero ¿de qué sirve probar si existe la posibilidad de eliminarlo? 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!
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 here .
Una forma alternativa de codificar la respuesta de Brettski, con la que estoy de acuerdo por completo, podría ser
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
Mismo efecto pero menos (bueno, nada) declaraciones de variables.
FileSystemObject es una herramienta realmente útil y vale la pena hacerse amigable. 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).
establezca una referencia a la biblioteca Scripting.Runtime y luego use FileSystemObject:
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if