it-swarm.it

Eliminazione di un file in VBA

Utilizzando VBA, come posso:

  1. verifica se esiste un file e, in tal caso,
  2. cancellalo?
108
inglesp

1.) Seleziona qui . Fondamentalmente fai questo:

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

Lascio a te capire i vari errori di gestione necessari ma questi sono tra gli aspetti di gestione degli errori che prenderei in considerazione:

  • Controlla se viene passata una stringa vuota.
  • Verifica la presenza di una stringa contenente caratteri illegali in un nome/percorso di file

2.) Come eliminare un file. Guarda questo. Fondamentalmente usa il comando Kill ma devi consentire la possibilità che un file sia di sola lettura. Ecco una funzione per te:

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

Ancora una volta, lascerò a te l'errore di gestione e di nuovo queste sono le cose che prenderei in considerazione:

  • Questo dovrebbe comportarsi diversamente per una directory rispetto a un file? Un utente dovrebbe indicare esplicitamente di voler eliminare una directory?

  • Vuoi che il codice ripristini automaticamente l'attributo di sola lettura o all'utente dovrebbe essere fornita una sorta di indicazione che l'attributo di sola lettura è impostato?


EDIT: Contrassegnare questa risposta come wiki della comunità in modo che chiunque possa modificarla se necessario.

149
Onorio Catenacci

Potrebbe essere un modo alternativo per codificare la risposta di Brettski, con la quale altrimenti sono completamente d'accordo

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

Stesso effetto ma meno (bene, nessuna) dichiarazioni di variabili.

FileSystemObject è uno strumento davvero utile e con cui vale la pena familiarizzare. A parte qualsiasi altra cosa, per la scrittura di file di testo a volte può effettivamente essere più veloce dell'alternativa legacy, che può sorprendere alcune persone. (Almeno nella mia esperienza, YMMV).

49
Mike Woodhouse

Probabilmente mi fotterò per questo, ma che senso ha testare l'esistenza se hai intenzione di eliminarlo? Uno dei miei principali animali domestici è un'app che lancia una finestra di dialogo di errore con qualcosa del tipo "Impossibile eliminare il file, non esiste!"

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.

Se il file non esiste in primo luogo, missione compiuta!

13
JohnFx

Di seguito è possibile utilizzare per verificare l'esistenza di un file e quindi per eliminarlo.

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

In VB è normalmente Dir per trovare la directory del file. Se non è vuoto, esiste e quindi usa Kill per eliminare il file.

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

impostare un riferimento alla libreria Scripting.Runtime e quindi utilizzare FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

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

Ecco un suggerimento: stai riutilizzando il nome del file o stai pianificando di fare qualcosa che richiede la cancellazione immediata?

No?

Puoi ottenere VBA per eseguire il comando DEL "C:\TEMP\scratchpad.txt"/F dal comando Prompt in modo asincrono usando VBA.Shell:

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

Nota le doppie virgolette (carattere ASCII 34) attorno al nome del file: suppongo che tu abbia un percorso di rete o un nome file lungo contenente spazi.

Se si tratta di un file di grandi dimensioni o si trova su una connessione di rete lenta, la soluzione è Fire-and-forget. Certo, non vedrai mai se ha funzionato o meno; ma riprendi immediatamente il tuo VBA e ci sono momenti in cui è meglio che aspettare la rete.

3
Nigel Heffernan

È possibile impostare un riferimento alla libreria Scripting.Runtime e quindi utilizzare FileSystemObject. Ha un metodo DeleteFile e un metodo FileExists.

Vedi l'articolo MSDN qui .

2
Darrel Miller