[VBA] Supprimer un dossier non vide

7 réponses
Avatar
JièL
Salutatousses,

existe t'il une instruction VBA permettant de supprimer un dossier non
vide ?
J'ai bien trouvé un truc en VBScript, mais je voulais savoir si ça n'est
pas possible directement en VBA.

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder (Dossier_A_Supprimer), True

NB : le dossier peut contenir des fichiers ET des dossiers etc etc.

Merci d'avance

--
JièL chercheur d'instructions VBA

7 réponses

Avatar
MichD
Bonjour,

Cet objet "Scripting.FileSystemObject" est souvent utilisé par plusieurs
en VBA pour manipuler fichiers et répertoires.

Il appartient à la bibliothèque suivante :
"Microsoft Scripting Runtime" que tu peux cocher dans la fenêtre VBA
Outils / références /

Lorsque cette bibliothèque est coché, tu peux définir les variables
directement comme ceci :

Dim Fld As Folder
Dim Fichier As File
Dim FS As Scripting.FileSystemObject

Sinon, tu fais comme cela

Dim Fld As Object
Dim Fichier As Object
Dim FS As Object


Tu peux aussi utiliser cette ligne de code:
Elle supprime tous les fichiers du répertoire et le répertoire lui-même
y compris les sous-répertoires et leurs fichiers.

Le paramètre Q rend l'opération silencieuse, aucune demande n'est faite
à l'usager pour effectuer cette tâche.

'-------------------------
Sub test()
Dim Répertoire As String, Commande As String
Répertoire = "c:UsersMichDDocumentsTest"

Commande = Environ("comspec") & " /c RD /S /Q " & Répertoire
Shell Commande, 0
End Sub
'-------------------------
Avatar
MichD
En supplément,

Directement dans le modèle objet VBA, tu as cette ligne de commande :

VBA.FileSystem.RmDir Répertoire

Le hic, c'est que ce répertoire doit être vide, tu dois utiliser une
boucle pour supprimer tous les fichiers qu'il contient. Il ne doit
contenir de répertoire non plus!

'------------------------------------
Sub Test1()
Dim Répertoire As String, Fichier As String
Répertoire = "c:UsersMichDDocumentsTest"

Fichier = Dir(Répertoire & "*.*")

Do While Fichier <> ""
'supprime le fichier
VBA.FileSystem.Kill Répertoire & Fichier
Fichier = Dir()
Loop
'Supprime le répertoire
VBA.RmDir Répertoire
End Sub

'------------------------------------
Avatar
JièL
Le 19/05/2016 à 17:17, MichD a écrit :
Directement dans le modèle objet VBA, tu as cette ligne de commande :

VBA.FileSystem.RmDir Répertoire

Le hic, c'est que ce répertoire doit être vide,



OK, merci, j'en reste donc au
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder (Dossier_A_Supprimer), True

c'est finalement plus simple.

--
JièL simpliste
Avatar
isabelle
Le 2016-05-19 16:49, JièL a écrit :
Le hic, c'est que ce répertoire doit être vide,



OK, merci, j'en reste donc au
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder (Dossier_A_Supprimer), True

c'est finalement plus simple.




ce code est très simple aussi
et très silencieux,
et il fonctionne sans référence à une bibliothèque

Sub test()
Dim Répertoire As String, Commande As String
Répertoire = "c:UsersisabelleDocumentsTest1"
Commande = Environ("comspec") & " /c RD /S /Q " & Répertoire
Shell Commande, 0
End Sub

isabelle
Avatar
JièL
Le 20/05/2016 à 01:42, isabelle a écrit :
Le 2016-05-19 16:49, JièL a écrit :
Le hic, c'est que ce répertoire doit être vide,



OK, merci, j'en reste donc au
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder (Dossier_A_Supprimer), True

c'est finalement plus simple.



ce code est très simple aussi
et très silencieux,
et il fonctionne sans référence à une bibliothèque

Sub test()
Dim Répertoire As String, Commande As String
Répertoire = "c:UsersisabelleDocumentsTest1"
Commande = Environ("comspec") & " /c RD /S /Q " & Répertoire
Shell Commande, 0
End Sub

isabelle



Voui, j'avais vu aussi, mais pour une raison particulière, je ne peux
pas me servir du shell

Merci

--
JièL Shell, Antar, Esso etc etc
Avatar
HB
Bonsoir,

Dans certains cas, avec des chemins trop longs,
RD (cmd) et la méthode DeleteFolder du FSO (vb vbs vba) échoue.
J'en ai fait l'amère expérience ...

Depuis, j'utilise Robocopy qui tolère très très bien
les chemins très très long.

Absent sur XP (mais souvent rajouté par les utilisateurs),
cet outil est définitivement revenu avec W7 et
est présent depuis sur les OS microsoft qui suivirent.
(y compris W10)

Voici la fonction que j'utilise
dans mes scripts d'administration écrits en VBS.

Sa transcription dans VBA ne pose aucun problème.


Function EffaceDossier(NomDossier)
Dim objFSO, objFolder, VIDE, oSh, COMMANDE
VIDE = "c:TempVide"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.CreateFolder(VIDE)
Set oSh = CreateObject ("WScript.Shell")
COMMANDE = "Robocopy.exe " & VIDE & " "& NomDossier & " /MIR"
oSh.Run COMMANDE,0,true
Set oSh = Nothing
objFSO.deletefolder VIDE,True
Set objFSO = Nothing
End Function


Le 20/05/2016 à 09:52, JièL a écrit :
Le 20/05/2016 à 01:42, isabelle a écrit :
Le 2016-05-19 16:49, JièL a écrit :
Le hic, c'est que ce répertoire doit être vide,



OK, merci, j'en reste donc au
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder (Dossier_A_Supprimer), True

c'est finalement plus simple.





ce code est très simple aussi
et très silencieux,
et il fonctionne sans référence à une bibliothèque

Sub test()
Dim Répertoire As String, Commande As String
Répertoire = "c:UsersisabelleDocumentsTest1"
Commande = Environ("comspec") & " /c RD /S /Q " & Répertoire
Shell Commande, 0
End Sub

isabelle



Voui, j'avais vu aussi, mais pour une raison particulière, je ne peux
pas me servir du shell

Merci





---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Avatar
HB
Petites précisions :

1) Ce que j'ai nommé "nom trop long" correspond à un chemin complet
ayant plus de 255 caractères.
1) Ces pb proviennent rarement du nom du dossier à vider mais de
certains fichiers contenus qqpart à l'intérieur.

2) On peut par ailleurs obtenir le "nom court" (en script de commandes
avec %~FSA si %A contient le chemin d'origine) mais cela n'a aucun
rapport. pour donner le nom court, le système ne doit pas avoir de pb
avec le nom complet...

3) Ces problèmes de longueur sont assez fréquent dans les réseaux :
Soit un utilisateur AZERTY qui possède un espace perso dans
D:UtilisatSectionHSsChefsAZERTY sur un serveur;
Pour lui, ce partage est mappé avec la lettre P:

S'il y stocke un truc avec un chemin complet de 250 caractères (par
exemple) il n'a pas de problème.
C'est assez fréquent lorsque les gens enregistrent un truc (mail,
document téléchargé sur le web, ...) sans adapter le nom de fichier de
façon raisonnable.

Le serveur voit un chemin bien plus long et, du coup, certains outils
échouent ... (dont le VBS) ... pas robocopy.


( https://support.microsoft.com/fr-fr/kb/2891362
Je n'ai pas encore utilisé ce correctif
puisqu'il semble annoncé comme expérimental. )

Cordialement,

HB

Le 20/05/2016 à 23:43, HB a écrit :
Bonsoir,

Dans certains cas, avec des chemins trop longs,
RD (cmd) et la méthode DeleteFolder du FSO (vb vbs vba) échoue.
J'en ai fait l'amère expérience ...

Depuis, j'utilise Robocopy qui tolère très très bien
les chemins très très long.

Absent sur XP (mais souvent rajouté par les utilisateurs),
cet outil est définitivement revenu avec W7 et
est présent depuis sur les OS microsoft qui suivirent.
(y compris W10)

Voici la fonction que j'utilise
dans mes scripts d'administration écrits en VBS.

Sa transcription dans VBA ne pose aucun problème.


Function EffaceDossier(NomDossier)
Dim objFSO, objFolder, VIDE, oSh, COMMANDE
VIDE = "c:TempVide"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.CreateFolder(VIDE)
Set oSh = CreateObject ("WScript.Shell")
COMMANDE = "Robocopy.exe " & VIDE & " "& NomDossier & " /MIR"
oSh.Run COMMANDE,0,true
Set oSh = Nothing
objFSO.deletefolder VIDE,True
Set objFSO = Nothing
End Function


Le 20/05/2016 à 09:52, JièL a écrit :
Le 20/05/2016 à 01:42, isabelle a écrit :
Le 2016-05-19 16:49, JièL a écrit :
Le hic, c'est que ce répertoire doit être vide,



OK, merci, j'en reste donc au
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder (Dossier_A_Supprimer), True

c'est finalement plus simple.





ce code est très simple aussi
et très silencieux,
et il fonctionne sans référence à une bibliothèque

Sub test()
Dim Répertoire As String, Commande As String
Répertoire = "c:UsersisabelleDocumentsTest1"
Commande = Environ("comspec") & " /c RD /S /Q " & Répertoire
Shell Commande, 0
End Sub

isabelle



Voui, j'avais vu aussi, mais pour une raison particulière, je ne peux
pas me servir du shell

Merci





---
L'absence de virus dans ce courrier électronique a été vérifiée par le
logiciel antivirus Avast.
https://www.avast.com/antivirus





---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus