Usando VBA, ¿cómo puedo:
- probar si existe un archivo, y si es así,
- ¿bórralo?
Usando VBA, ¿cómo puedo:
1.) Verifique aquí . Básicamente haz esto:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Te dejo que descubras los diversos errores necesarios para el manejo, pero estos son algunos de los aspectos de manejo de errores que estaría considerando:
2.) Cómo eliminar un archivo. Mira esto Básicamente, use el comando Kill, pero debe permitir 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 de errores y nuevamente estas son las cosas que consideraría:
¿Debería esto comportarse de manera diferente para un directorio frente a 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 debe dar al usuario algún tipo de indicación de que el atributo de solo lectura está configurado?
EDITAR: Marcar esta respuesta como wiki de la comunidad para que cualquiera pueda modificarla si es necesario.
Una forma alternativa de codificar la respuesta de Brettski, con la que estoy totalmente de acuerdo, podría ser
Mismo efecto pero menos (bueno, ninguna en absoluto) declaraciones variables.
FileSystemObject es una herramienta realmente útil y con la que vale la pena hacerse amigable. Además de cualquier otra cosa, para la escritura de archivos de texto, a veces puede ser más rápido que la alternativa heredada, lo que puede sorprender a algunas personas. (En mi experiencia al menos, YMMV).
fuente
Probablemente me criticarán por esto, pero ¿cuál es el punto de probar la existencia si solo lo vas a eliminar? Una de mis principales preocupaciones es una aplicación que muestra un cuadro de diálogo de error con algo como "¡No se pudo eliminar el archivo, no existe!"
Si el archivo no existe en primer lugar, ¡misión cumplida!
fuente
ActiveWorkbook.SaveCopyAs
no puede sobrescribir, por lo que primero debe eliminar el archivo existente con el mismo nombre de archivo.On Error Resume Next
, o eso me han dicho: D Por supuesto, ese es un consejo ridículo, y tu respuesta es correcta.Len(dir(...))
parte no es SOLAMENTE para verificar la existencia. También se comprueba si el archivo está oculto porque un archivo oculto devolverá una cadena vacía, incluso si existe (y no será capaz de eliminarlo):Dir(hiddenFile) = ""
. Por lo tanto, la parteSetAttr FileToDelete, vbNormal
elocuentemente se encarga de esto por usted.Lo siguiente se puede usar para probar la existencia de un archivo y luego eliminarlo.
fuente
Len()
(yLenB()
, que es aún más rápido) es más rápido que la comparación de cadenas es que en la memoria, las cadenas VB están precedidas por su longitud. Len / LenB solo extrae la longitud de esa ubicación de memoria, no tienen que recorrer la cadena para conocer su longitud. Por otro lado, usar 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. Utilice en suvbNullString
lugar, ya que es una constante y no utiliza más memoria.En VB normalmente
Dir
es encontrar el directorio del archivo. Si no está en blanco, entonces existe y luego se usaKill
para deshacerse del archivo.fuente
establezca una referencia a la biblioteca Scripting.Runtime y luego use FileSystemObject:
fuente
Aquí hay un consejo: ¿está reutilizando el nombre del archivo o planea hacer algo que requiera la eliminación de inmediato?
¿No?
Puede hacer que VBA active el comando DEL "C: \ TEMP \ scratchpad.txt" / F desde el símbolo del sistema de forma asincrónica usando VBA.Shell:
Shell "DEL" y chr (34) y strPath y chr (34) y "/ F", vbHide
Tenga en cuenta las comillas dobles (carácter ASCII 34) alrededor del nombre del 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 de inmediato, y hay momentos en que esto es mejor que esperar a la red.
fuente
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í .
fuente