Supprimer un fichier dans VBA

Réponses:

168

1.) Vérifiez ici . En gros, faites ceci:

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

Je vous laisse le soin de déterminer les différentes méthodes de gestion des erreurs nécessaires, mais ce sont parmi les choses de gestion des erreurs que j'envisagerais:

  • Vérifiez qu'une chaîne vide est passée.
  • Recherchez une chaîne contenant des caractères illégaux dans un nom / chemin de fichier

2.) Comment supprimer un fichier. Regarde ça. En gros, utilisez la commande Kill, mais vous devez prévoir la possibilité qu'un fichier soit en lecture seule. Voici une fonction pour vous:

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

Encore une fois, je vous laisse la gestion des erreurs et encore une fois, ce sont les choses que je considérerais:

  • Cela devrait-il se comporter différemment pour un répertoire par rapport à un fichier? Un utilisateur doit-il avoir à indiquer explicitement qu'il souhaite supprimer un répertoire?

  • Voulez-vous que le code réinitialise automatiquement l'attribut en lecture seule ou l'utilisateur doit-il recevoir une sorte d'indication que l'attribut en lecture seule est défini?


EDIT: Marquer cette réponse comme wiki de la communauté afin que tout le monde puisse la modifier si nécessaire.

Onorio Catenacci
la source
merci - et s'il y a deux fichiers du même nom qui existent, le sous DeleteFile les tuera-t-il tous les deux ou un seul? tout conseil très apprécié.
BKSpurgeon
6
Vous ne pouvez pas avoir deux fichiers avec le même nom dans un répertoire.
Onorio Catenacci
52

Une autre façon de coder la réponse de Brettski, avec laquelle je suis entièrement d'accord, pourrait être

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

Même effet, mais moins de déclarations de variables (enfin aucune).

Le FileSystemObject est un outil vraiment utile et il vaut la peine de se familiariser avec. En dehors de toute autre chose, l'écriture de fichiers texte peut parfois être plus rapide que l'alternative héritée, ce qui peut surprendre quelques personnes. (Dans mon expérience au moins, YMMV).

Mike Woodhouse
la source
7
En utilisant cette syntaxe sans déclarer un objet de script de fichier, vous devez ajouter une référence pour Microsoft Scripting Runtime, sinon: Dim fs As New Scripting.FileSystemObject
pghcpa
5
vous devez également référencer la bibliothèque de scripts. voir ici: stackoverflow.com/questions/3233203/…
ekkis
Puisqu'il n'y a aucune variable à définir sur Nothing, y a-t-il un risque que FileSystemObject reste en mémoire, provoquant une fuite ou un autre problème?
johny why
Non, il sera supprimé après le "Fin par". Puisqu'il n'est pas affecté à une variable, l'effet est similaire au fait que l'objet a été affecté à une variable qui a été définie sur "Rien".
jony
15

Je vais probablement m'enflammer pour cela, mais quel est l'intérêt de tester l'existence si vous allez simplement le supprimer? Une de mes principales bêtes noires est une application qui lance une boîte de dialogue d'erreur avec quelque chose comme "Impossible de supprimer le fichier, il n'existe pas!"

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 le fichier n'existe pas en premier lieu, mission accomplie!

JohnFx
la source
4
Vous soulevez un bon point mais, comme la plupart des choses, je pense que cela dépendrait du contexte et parfois simplement avoir une fonction "Fichier existe" est pratique en dehors de la suppression.
Onorio Catenacci
3
+1: peut-être que l'utilisateur de l'application souhaite être interrogé avant de supprimer un fichier: par exemple, l'utilisation ActiveWorkbook.SaveCopyAsne permet pas d'écraser, vous devez donc d'abord supprimer le fichier existant avec le même nom de fichier.
Joël
mais vous ne devriez jamais utiliser On Error Resume Next, ou alors on m'a dit: D Bien sûr, c'est un conseil ridicule, et votre réponse est correcte.
johny why
La Len(dir(...))partie n'est pas SEULEMENT pour vérifier l'existence. Il est également vérifier si le fichier est HIDDEN car un fichier caché retourne une chaîne vide , même si elle existe (et vous ne serez pas en mesure de le supprimer): Dir(hiddenFile) = "". Par conséquent, la partie s'en SetAttr FileToDelete, vbNormaloccupe avec éloquence pour vous.
elektrykalAJ
11

Ce qui suit peut être utilisé pour tester l'existence d'un fichier, puis pour le supprimer.

Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
     Kill aFile
End If 
Rich Adams
la source
3
Je sais que cette question et cette réponse sont anciennes, je pensais juste ajouter que l'utilisation de Len () pour tester des chaînes (et des fonctions qui renvoient des chaînes) semble être plus rapide que les comparaisons de chaînes littérales dans VBA.
JimmyPena
7
La raison pour laquelle Len()(et LenB(), ce qui est encore plus rapide) sont plus rapides que la comparaison de chaînes, c'est qu'en mémoire, les chaînes VB sont précédées de leur longueur. Len / LenB extrait juste la longueur de cet emplacement mémoire, ils n'ont pas à parcourir la chaîne pour connaître sa longueur. D'autre part, l'utilisation de la comparaison de chaînes a beaucoup plus de travail à faire. De plus, évitez d'utiliser ""dans VB car il alloue toujours une nouvelle chaîne. Utilisez à la vbNullStringplace car il s'agit d'une constante et n'utilise pas plus de mémoire.
Renaud Bompuis
7

Dans VB, il trouve normalement Dirle répertoire du fichier. S'il n'est pas vide, il existe et utilisez-le Killpour se débarrasser du fichier.

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

définissez une référence à la bibliothèque Scripting.Runtime , puis utilisez FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

if (fso.FileExists("PathToFile")) then
    aFile = fso.GetFile("PathToFile")
    aFile.Delete
End if
Brettski
la source
J'utilise aussi la méthode FileSystemObject, car Kill ne peut pas supprimer les fichiers / dossiers atteints de
diacrite
C'est la méthode que j'utilise. Quelqu'un qui l'implémente veut utiliser la vérification des erreurs et DisplayAlerts = false. (Le fichier ne sera pas supprimé s'il est utilisé, il doit donc avoir un piège d'erreur)
Gregg Burns
3

Voici un conseil: réutilisez-vous le nom du fichier ou prévoyez-vous de faire quelque chose qui nécessite la suppression immédiate?

Non?

Vous pouvez demander à VBA de lancer la commande DEL "C: \ TEMP \ scratchpad.txt" / F à partir de l'invite de commande de manière asynchrone en utilisant VBA.Shell:

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

Notez les doubles guillemets (caractère ASCII 34) autour du nom de fichier: je suppose que vous avez un chemin réseau ou un nom de fichier long contenant des espaces.

S'il s'agit d'un gros fichier ou d'une connexion réseau lente, le feu et l'oubli est la voie à suivre. Bien sûr, vous ne voyez jamais si cela a fonctionné ou non; mais vous reprenez votre VBA immédiatement, et il y a des moments où c'est mieux que d'attendre le réseau.

Nil
la source
C'est une excellente alternative, si l' asynchrone est ce que vous voulez.
johny why
2

Vous pouvez définir une référence à la bibliothèque Scripting.Runtime, puis utiliser FileSystemObject. Il a une méthode DeleteFile et une méthode FileExists.

Consultez l'article MSDN ici .

Darrel Miller
la source