Il est possible, et même assez facile de travailler avec des fichiers en VBA. Après le tutoriel Manipulation basique des fichiers en VBA , je vous propose une nouvelle série des codes VBA, cette fois-ci axés sur la suppression des fichiers et des dossiers en VBA.
Les codes sources VBA qui suivent servent à supprimer de différentes manières des fichiers, des dossiers ou les deux en même temps. C'est une fonctionnalité très pratique de VBA mais…
Attention: Les fichiers/dossiers ainsi supprimés ne sont plus récupérables. Ils ne sont pas déplacés dans la Corbeille non plus. Ils sont tout simplement supprimés pour de bon!
Sommaire
Supprimer un fichier en VBA
Ceci est le cas le plus simple – nous voulons supprimer un fichier particulier. C'est la fonction VBA Kill qui permet de supprimer un fichier. Voici le code VBA:
1 2 3 4 5 |
Sub SupprimerFichier() Kill "C:\Exemple\TestsVBA\Rapport_annuel.xlsx" End Sub |
Pour éviter les erreurs, il est utile de vérifier d'abord si le fichier en question existe. Pour cela, on utilisera les fonctions VBA Len et Dir (plus d'informations dans le tutoriel dédié à ce sujet)
1 2 3 4 5 6 7 |
Sub SupprimerFichier() Dim FichierASupprimer As String FichierASupprimer = "C:\Exemple\TestsVBA\Rapport_annuel.xlsx" '<- le nom du fichier à supprimer If Len(Dir(FichierASupprimer)) > 0 Then Kill FichierASupprimer End Sub |
Supprimer tous les fichiers dans un dossier en VBA
Le code VBA suivant vous permettra de supprimer définitivement tous les fichiers dans un dossier:
1 2 3 4 5 |
Sub SupprimerTousLesFichiersDansDossier() Kill "C:\Users\Ron\Test\*.*" End Sub |
Vous pouvez constater le *.*
dans le code qui correspond à l'expression en métacaractères où une astérisque remplace une chaîne de caractères de n'importe quelle longueur (ici, cela signifie donc que l'on va supprimer des fichiers avec n'importe quel nom et n'importe quelle suffixe)
Et même ici, il est préférable de vérifier d'abord si le dossier existe:
1 2 3 4 5 6 7 8 9 |
Sub SupprimerTousLesFichiersDansDossier() Dim DossierANettoyer As String If Len(Dir("C:\Exemple\TestsVBA\", vbDirectory)) > 0 Then Kill "C:\Exemple\TestsVBA\*.*" Else End If End Sub |
Supprimer tous les fichiers remplissant un critère dans un dossier
Maintenant, imaginons que vous souhaitez supprimer tous les fichiers qui remplissent un critère particulier (exemple: tous les fichiers Excel, tous les fichiers PDF ou tous les fichiers dont le nom contient "test"). Voici le code VBA à utiliser dans ce cas-ci:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Sub SupprimerCertainsFichiersDansDossier_1() 'supprime tous les fichiers PDF Dim DossierANettoyer As String If Len(Dir("C:\Exemple\TestsVBA\", vbDirectory)) > 0 Then Kill "C:\Exemple\TestsVBA\*.pdf" Else End If End Sub Sub SupprimerCertainsFichiersDansDossier_2() 'supprime tous les fichiers dont le nom contient "test" Dim DossierANettoyer As String If Len(Dir("C:\Exemple\TestsVBA\", vbDirectory)) > 0 Then Kill "C:\Exemple\TestsVBA\*test*.*" Else End If End Sub Sub SupprimerCertainsFichiersDansDossier_3() 'supprime tous les fichiers Word, que ce soit les .DOCX ou les .DOCM etc. Dim DossierANettoyer As String If Len(Dir("C:\Exemple\TestsVBA\", vbDirectory)) > 0 Then Kill "C:\Exemple\TestsVBA\*.doc*" Else End If End Sub |
Supprimer un dossier et tous les sous-dossiers et fichiers qu'il contient
Et pour finir, vous pouvez aussi, grâce à un seul code, supprimer un dossier avec tout ce qu'il contient (fichiers, sous-dossiers)…
Mais je répète l'avertissement: soyez prudents car ce qui est effacé de cette manière est irrécupérable.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Sub SupprimerDossierAvecTouLeContenu() 'Assurez-vous qu'aucun fichier de ce dossier n'est pas ouvert... Dim FSO As Object Dim DossierASupprimer As String Set FSO = CreateObject("Scripting.FileSystemObject") DossierASupprimer = "C:\Exemple\TestsVBA" '<- remplacez par votre dossier If Right(DossierASupprimer, 1) <> "\" Then DossierASupprimer = DossierASupprimer & "\" If Len(Dir(DossierASupprimer, vbDirectory)) = 0 Then MsgBox "Le dossier: " & DossierASupprimer & " n'existe pas..." Exit Sub End If On Error Resume Next 'Supprimer les fichiers FSO.DeleteFile DossierASupprimer & "*.*", True 'Supprime les sous-dossiers FSO.DeleteFolder DossierASupprimer & "*.*", True 'Supprime le dossier principal RmDir DossierASupprimer On Error GoTo 0 End Sub |
Conclusion de ce tutoriel
Avec ces codes VBA, vous pouvez pousser encore plus loin les possibilités de VBA – on est déjà bien loin de "ajout des bordures dans un tableau Excel"… Ces codes constituent des exemples pour montrer de manière la plus simple le principe de suppression de fichiers et dossiers en VBA. Vous pouvez facilement les transformer en fonctions qui qui auront pour argument le nom du fichier ou du dossier à supprimer. Ainsi, vous aurez des fonctions facilement réutilisables pour vos projets.
Pour aller plus loin en VBA
Si ce tutoriel vous a été utile, n'hésitez pas à parcourir ce site car vous y trouverez sans doute d'autres informations pratiques qui vont vous servir dans votre utilisation de VBA. En voici quelques exemples…
- Liste de toutes les fonctions disponibles dans VBA
- Calculer la SOMME en VBA
- La structure "Dictionnaire" en VBA
- Utiliser la fonction RECHERCHEV en VBA
- Envoyer un email avec VBA
- …
Et n'oubliez pas de passer par la section "Téléchargements" pour voir ce qui est possible de faire grâce à VBA…
7 commentaires sur “Supprimer des fichiers et des dossiers en VBA”
n’est ce pas utile de décharger la variable objet "fso" en la mettant à null à la fin de la procédure ?
Bonjour,
vu qu'il s'agit de la fin de la macro, il n'est pas nécessaire de la décharger (ce serait
Set FSO = Nothing
, pasNull
).Dans VBA, chaque objet est déchargé automatiquement de la mémoire quand il quitte son "scope".
Les deux seules raisons de le faire manuellement est:
a) quand on a besoin de le décharger avant qu'il n'arrive en dehors de son scope (par exemple lors de longues procédures où quand on n'aura plus besoin de l'objet en question et au contraire on aurait besoin de plus de ressources)
b) quand il y a une référence circulaire entre deux ou plusieurs objets
Ce n'est pas le cas dans ce code-ci, il n'est donc pas nécessaire de décharger le "FSO" manuellement.
Cordialement, Martin
Bonjour,
J'essaye de supprimer des fichiers via VBA dans un répertoire que l'utilisateur choisit. L'adresse du dossier est donc une variable. Mon problème est que je ne contrôle donc pas cette adresse, et qu'elle peut contenir des espaces… ce qui génère une erreur "fichier introuvable".
Comment puis-je gérer la présence d'espaces dans le chemin d'accès aux fichiers à supprimer ?
Bonjour, votre tuto est très intéressant et instructif. Je suis dans un autre cas de figure où je dois supprimer des fichiers qui ne sont pas dans une liste. Ex. J'ai un dossier de 100000 fichiers (. Pdf), je ne dois en garder qu'un certain nombre, qui se trouve listé dans une feuille xls. Comment m'y prendre ?
Merci beaucoup.
Henry.
Bonjour Henry,
le plus simple (du point de vue du code), à mon humble avis est de copier les fichiers à garder dans un autre dossier et ensuite supprimer le dossier d'origine entièrement.
Ce serait probablement aussi la solution la plus rapide au niveau d'exécution de la macro.
Voici un exemple (qui assume que vous avez dans le classeur une feuille avec la liste des fichiers – noms de fichiers, pas les chemins complets).
Attention: les fichiers ainsi traités seront supprimés directement (pas de passage par la Corbeille). Donc testez le d'abord sur un dossier test.
Phrase obligé donc 🙂 : "Celui qui utilise ce code est le seul responsable de dommage qu'il pourrait (se) causer. Je décline toute responsabilité concernant l'utilisation de ce code."
Et voici déjà le code:
J'espère que cela va vous aider.
Cordialement, Martin
Super tuto.
Est-il possible d'effacer le contenu d'un dossier mais uniquement les fichiers datant de plus d'un mois?
merci