Dans ce tutoriel, vous apprendrez à utiliser VBA pour copier un dossier avec son contenu. Vous avez déjà pu apprendre les manipulations basiques avec des fichiers en VBA, ceci est donc une extension. Car en VBA, il est également possible de copier des dossiers entiers.
La méthode .CopyFolder
En gros, nous allons créer un nouvel Objet FSO (FileSystemObject
) qui nous permettra d'utiliser la méthode .CopyFolder
pour copier un dossier.
Voici donc les 3 lignes de code VBA dont vous aurez besoin (aucune Référence
particulière n'est nécessaire). Ce n'est vraiment pas compliqué.
1 2 3 |
Dim objFSO As Object Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.CopyFolder "C:\test\DossierOriginal", "C:\test2\SousDossier\CopieDuDossierOriginal", True |
Vous pouvez constater que la méthode .CopyFile
a 3 arguments:
- le dossier à copier
- la destination du dossier
- choix si le dossier de destination peut (
True
) ou ne peut pas (False
) être surécrit
Comme indiqué plus haut, ce code va copier le dossier avec tout son contenu (sous-dossiers et fichiers). Si le dossier que vous voulez copier n'existe pas, la macro va bloquer avec un message d'erreur. C'est pourquoi je vous conseille de d'abord vérifier si le dossier existe.
Vous pouvez également vérifier si le nouveau dossier n'existe pas déjà. Car s'il existe déjà, vous risquez de sur-écrire des fichiers existants.
Attention, les deux dossiers ne peuvent pas se terminer par la barre oblique ("/") ou la barre oblique inverse ("\"). Si c'est le cas, le code va bloquer et générer une erreur.
Code VBA en tant que fonction pour copier un dossier
Il est bien sûr possible de faire de ce code une fonction indépendante qui utilisera des variables et aura pour arguments le chemin du dossier à copier ainsi que le chemin du nouveau dossier…
Cette fonction, dont le code suit, retourne comme résultat un Boolean
(VRAI / FAUX – TRUE
/ FALSE
): TRUE
si le dossier a pu être copié, FALSE
si une erreur s'est produite quelque part.
Elle contient quelques améliorations:
- une vérification est faite au cas où un (les) argument(s) serait vide
- elle vérifie si le dossier qui doit être copié existe
- elle vérifie si les chemins ne contiennent pas les barres obliques à la fin, si oui, une correction est faite automatiquement
On obtient ainsi une fonction plus robuste qui ne plantera pas votre macro même en cas de problème…
Et voici donc le code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Public Function CopieDossier(DossierOriginal As String, DossierCopie As String) 'par Excel-Malin.com ( https://excel-malin.com ) CopieDossier = False 'vérifie si les arguments ne sont pas vides If DossierOriginal = "" Or DossierCopie = "" Then Exit Function 'vérifie s'il n'y a pas des (back)slash à la fin des deux chemins If Right(DossierOriginal, 1) = "\" Or Right(DossierOriginal, 1) = "/" Then DossierOriginal = Left(DossierOriginal, Len(DossierOriginal) - 1) If Right(DossierCopie, 1) = "\" Or Right(DossierCopie, 1) = "/" Then DossierCopie = Left(DossierCopie, Len(DossierCopie) - 1) 'teste si le Dossier original existe, si oui, copie le dossier et retourne valeur True, si non, retourne valeur False If Len(Dir(DossierOriginal, vbDirectory)) = 0 Then Exit Function Else Dim objFSO As Object Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.CopyFolder DossierOriginal, DossierCopie, True CopieDossier = True End If End Function |
Et ici deux exemples de l'utilisation de cette fonction…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub Test_copie_dossier_1() If CopieDossier("C:\test\DossierOriginal", "C:\test2\SousDossier\CopieDuDossierOriginal\") = True Then MsgBox "Dossier a été copié" Else MsgBox "Un problème est survenu..." End If End Sub '-------------------------------------------------------------------------- Sub Test_copie_dossier_2() Dim AncienDossier As String Dim NouveauDossier As String AncienDossier = "C:\test\DossierOriginal" NouveauDossier = "C:\test2\SousDossier\CopieDuDossierOriginal\" If CopieDossier(AncienDossier, NouveauDossier) = True Then MsgBox "Dossier a été copié" Else MsgBox "Un problème est survenu..." End If End Sub |
Conclusion
Une fonction relativement simple mais qui peut tout de même vous économiser le temps et permettre d'ajouter nouvelles fonctionnalités à vos applications en VBA et en Excel. Vous pouvez l'utiliser par exemple pour l'archivage régulier des données ou encore pour une migration des données d'un endroit à l'autre… C'est un bon exemple qui montre que VBA peut servir à d'autres fins que d'automatiser la création des tableaux en Excel!
Vous pouvez aussi consulter la Page Microsoft dédiée à la méthode .CopyFolder
. Attention, il s'agit d'une traduction automatique (anglais >> français)…
Pour aller plus loin en VBA…
Pour terminer, je vous propose quelques autres tutoriels qui pourraient vous être utiles.
- Liste de toutes les fonctions disponibles en VBA
- RECHERCHEV en VBA – pour se faciliter la vie
- Calculer la SOMME en VBA – plusieurs méthodes
- Suppression des dossiers en VBA
- Envoyer un email à partir d'Excel avec VBA
- Débloquer VBA dans les fichiers en provenance d'internet
4 commentaires sur “VBA: copier un dossier et son contenu”
très clair! merci
Bonjour. Le test des différents scripts me donne une erreur 70, "Permission refusée" !
Une idée sur la cause du problème ?
Bonjour JC,
êtes-vous sûr d'avoir les droits d'écriture dans le dossier (disque) de destination?
Que se passe-t-il si vous faites la même copie du dossier (même source et même destination) manuellement?
Martin
Bonjour,
Le dossier que je veux copier se trouve sur un réseau qui me demande un nom d’utilisateur et mot de passe pour pouvoir avoir accès.
Comment intégrer à ce code le nom d’utilisateur et le mot de passe?
Depuis le navigateur Windows je peux sans problème copier ce dossier (après avoir saisi mon identifiant et mot de passe), mais depuis ce code j'ai un message d'erreur: "Erreur d'execution 70: Permission refusée"
Merci pour votre réponse et votre aide, je débute en VBA et je galère un peu (même beaucoup!)