web-dev-qa-db-fra.com

Supprimer un fichier dans VBA

Avec VBA, comment puis-je:

  1. tester si un fichier existe, et si oui,
  2. supprime-le?
113
inglesp

1.) Vérifiez ici . Fondamentalement faire 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 qu'une chaîne vide est passée.
  • Rechercher 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 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 vais laisser la gestion des erreurs à vous et encore 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 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.

157
Onorio Catenacci

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.

FileSystemObject est un outil vraiment utile et qui mérite d'être mis à l'aise. 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).

50
Mike Woodhouse

Je vais probablement être enflammé pour cela, mais quel est l'intérêt de tester l'existence si vous voulez simplement le supprimer? L'un de mes principaux ennemis est une application qui lance 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!

13
JohnFx

Les éléments suivants peuvent être utilisés 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 
10
Rich Adams

Dans VB c'est normalement Dir pour trouver le répertoire du fichier. Si ce n'est pas vide, alors il existe et utilisez ensuite Kill pour supprimer le fichier.

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

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
4
Brettski

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

Non?

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

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

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

Si le fichier est volumineux ou sur une connexion réseau lente, il est préférable de faire feu et d’oublier. 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.

3
Nigel Heffernan

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 .

2
Darrel Miller