Supprimer un fichier dans VBA
-
09-06-2019 - |
Question
Avec VBA, comment puis-je:
- teste l'existence d'un fichier et, le cas échéant,
- le supprimer?
La solution
1.) Vérifiez ici . Fondamentalement, 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 traitement des erreurs nécessaires, mais celles-ci font partie des problèmes de traitement des erreurs que je prendrais en considération:
- Vérifiez si une chaîne vide est passée.
- Recherche une chaîne contenant des caractères non autorisés dans un nom de fichier / chemin
2.) Comment supprimer un fichier. Regardez this. Utilisez essentiellement la commande Kill, mais vous devez autoriser la possibilité d'un fichier 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 laisserai le traitement des erreurs et voici les points que je prendrais en considération:
-
Cela devrait-il se comporter différemment d’un répertoire à un fichier? Un utilisateur doit-il explicitement indiquer son intention de supprimer un répertoire?
-
Voulez-vous que le code réinitialise automatiquement l'attribut en lecture seule ou devez-vous indiquer à l'utilisateur une sorte d'indication que l'attribut en lecture seule est défini?
EDIT: Marquer cette réponse comme un wiki de communauté afin que tout le monde puisse la modifier si besoin est.
Autres conseils
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).
FileSystemObject est un outil vraiment utile et qui mérite d’être convivial. En dehors de toute autre chose, l'écriture de fichier texte peut parfois être plus rapide que l'alternative classique, ce qui peut surprendre quelques personnes. (Dans mon expérience au moins, YMMV).
Je vais probablement me faire flamber pour cela, mais quel est l'intérêt de tester l'existence si vous voulez juste le supprimer? L'un de mes principaux ennemis est une application qui ouvre une boîte de dialogue d'erreur avec le message "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, mission accomplie!
Vous pouvez utiliser les éléments suivants pour vérifier 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
En VB, son Dir
sert normalement à trouver le répertoire du fichier. S'il n'est pas vide, il existe et utilisez Kill
pour supprimer le fichier.
test = Dir(Filename)
If Not test = "" Then
Kill (Filename)
End If
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
Voici un conseil: réutilisez-vous le nom du fichier ou prévoyez-vous quelque chose qui nécessite la suppression immédiate?
Non?
Vous pouvez demander à VBA d'activer la commande DEL & C; \ C: \ TEMP \ scratchpad.txt & "; / F à partir de l'invite de commande de manière asynchrone à l'aide de VBA.Shell:
Shell & DEL; DEL " & amp; chr (34) & amp; strPath & amp; chr (34) & amp; " / F ", vbHide
Notez les guillemets (caractère ASCII 34) autour du nom du fichier: je suppose que vous avez un chemin réseau ou un nom de fichier long contenant des espaces.
Si le fichier est volumineux ou s’il s’agit d’une connexion réseau lente, il est impératif de procéder de manière autonome. Bien sûr, vous ne voyez jamais si cela a fonctionné ou non; mais vous reprenez immédiatement votre VBA, et il est parfois préférable d’attendre le réseau.
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.
Voir l'article MSDN ici .