formateur informatique

Déplacer ou copier des fichiers en VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Déplacer ou copier des fichiers en VBA Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Déplacer ou copier des fichiers

Avec cette nouvelle astuce VBA Excel, nous allons apprendre à copier ou à déplacer des fichiers, sur le disque. Cette technique s'avère importante lorsqu'il s'agit par exemple, de réaliser des sauvegardes périodiques de documents importants, comme des factures clients. De plus, nous avons déjà appris à déclencher des événements à des heures précises.

Feuille Excel pour copier ou déplacer des fichiers en VBA

Sur l'exemple illustré par la capture, l'utilisateur peut actionner l'une des deux cases à cocher (groupe d'options). Il définit ainsi s'il souhaite copier ou déplacer les fichiers qui sont encore à définir. A ce titre, il dispose de deux boutons matérialisés chacun par l'icône d'un dossier. Tous deux ouvrent une boîte de dialogue standard permettant de stipuler un dossier. Après les avoir définis, le code VBA procède à la copie ou au déplacement et le résumé est livré dans deux colonnes de couleurs respectives bleue et verte.

Classeur Excel à télécharger
Nous proposons de réaliser ce développement sur un classeur offrant déjà quelques outils. Cette décompression livre le fichier Excel accompagné d'un sous-dossier nommé archives_factures. Il abrite quelques factures au format PDF qu'il va s'agir de sécuriser.
  • Cliquer avec le bouton droit de la souris sur le fichier Excel,
  • En bas du menu contextuel, choisir la commande Propriétés,
  • En bas de la boîte de dialogue, cocher la case Débloquer et valider par le bouton Ok,
  • Dès lors, double cliquer sur le fichier pour l'ouvrir dans Excel,
Nous découvrons effectivement une feuille fidèle à celle de la présentation, avec ses deux cases à cocher et ses deux boutons. Un clic sur le premier doit permettre de désigner le dossier contenant les fichiers à copier ou à déplacer. Ce chemin d'accès doit être sauvegardé juste à côté, en cellule fusionnée à partir de C3. Un clic sur le second doit permettre de définir le dossier de destination. Et ce nouveau chemin d'accès doit être inscrit en cellule fusionnée à partir de C4. Les fichiers de ces dossiers doivent être énumérés en plages respectives C7:C30 et E7:E30.

Les procédures des boutons
Ces deux boutons sont déjà associés à des procédures et nous proposons de le constater.
  • Cliquer avec le bouton droit de la souris sur le premier bouton à l'icône d'un dossier,
  • En bas du menu contextuel, choisir la commande Affecter une macro,
  • Dans la boîte de dialogue qui suit, cliquer sur le bouton Modifier,
Accéder au code VBA associé à un bouton de feuille Excel

De cette manière, nous basculons dans l'éditeur VBA Excel, entre les bornes de la procédure source. Son code se déclenchera au clic sur ce premier bouton. Et à ce titre, vous notez la présence d'une autre procédure. Elle se nomme cible. Elle est associée au second bouton.

Les variables
Pour ce premier bouton, étant donné que nous devons être en mesure de désigner un dossier et de manipuler les fichiers qu'il contient, nous avons besoin de déclarer des variables pour manipuler les boîtes de dialogue standards mais aussi les fichiers du disque.
  • Dans les bornes de la procédure source, ajouter les déclarations de variables suivantes :
...
Dim boite As FileDialog: Dim chemin As String
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
Dim compteur As Byte
...


Nous déclarons un objet que nous nommons boite et que nous typons comme un FileDialog pour manipuler les boîtes de dialogue standards d'Office. Cette déclaration est rendue possible car nous avions anticipé. Nous avions ajouté la référence nécessaire à ce projet. Elle se nomme Microsoft Office 16.0 Object Library. Vous pouvez le constater en déployant le menu Outils et en choisissant la rubrique Références. La variable chemin, typée comme un texte (String) est destinée à mémoriser le chemin d'accès au dossier désigné par l'utilisateur par le biais de cette boîte de dialogue. Les trois objets qui suivent (Object) doivent permettre de manipuler les fichiers et les dossiers du disque, après instanciation de la classe dédiée, nous le verrons. Enfin, la variable compteur doit suivre le processus consistant à analyser chaque fichier du dossier, pour restituer leurs noms, les uns en-dessous des autres sur la feuille.

Initialiser les variables
Grâce à ces déclarations, nous pouvons désormais initialiser certaines de ces variables notamment celle qui est destinée à instancier la classe des boîtes de dialogue standards.
  • Après les variables, ajouter les instructions VBA suivantes :
...
compteur = 7
ActiveSheet.Range("C7:C30").Value = ""
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then chemin = boite.SelectedItems(1)

If chemin <> "" Then
ActiveSheet.Cells(3, 3).Value = chemin
ActiveSheet.Cells(6, 3).Value = "Source : " & Mid(chemin, InStrRev(chemin, "\") + 1)

End If
...


Nous initialisons la variable de boucle (compteur) sur la première ligne (7) à partir de laquelle il est question de restituer les noms des fichiers à copier ou à déplacer. Nous effaçons une potentielle précédente importation (Range("C7:C30").Value = ""), pour recevoir la nouvelle dans les meilleures conditions. Grâce à la propriété FileDialog de l'objet Application et à son paramètre msoFileDialogFolderPicker, nous initialisons (Set) l'objet boite, de manière à piloter une boîte de dialogue permettant de désigner un dossier. Nous affichons cette boîte (Show). Nous récupérons le dossier désigné par l'utilisateur (boite.SelectedItems(1)). Si un dossier est bien spécifié (If chemin <> "" Then), nous inscrivons le chemin d'accès en cellule C3 fusionnée. Puis en cellule C6 (Cells(6, 3).Value), nous ne restituons que le nom du dossier sans le chemin. Pour cela, nous exploitons la fonction Mid de découpe, à laquelle nous imbriquons la fonction InStrRev pour trouver la position du dernier antislash (\). C'est ainsi que nous récupérons ce qui se situe après, soit uniquement le nom du dossier désigné.

Manipuler les fichiers
Maintenant, il est temps d'instancier la classe permettant de manipuler les fichiers et les dossiers du disque. C'est grâce à elle que nous allons pouvoir parcourir tous les éléments présents dans le dossier spécifié par l'utilisateur, par le biais de la boîte de dialogue.
  • A la suite du code de l'instruction conditionnelle, ajouter les deux lignes VBA suivantes :
...
If chemin <> "" Then
ActiveSheet.Cells(3, 3).Value = chemin
ActiveSheet.Cells(6, 3).Value = "Source : " & Mid(chemin, InStrRev(chemin, "\") + 1)

Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(chemin)


End If
...


C'est grâce à la fonction VBA CreateObject, avec le paramètre scripting.filesystemobject, que nous initialisons (Set) l'objet objetFichier. Dès lors, il hérite de ses propriétés et méthodes. C'est ainsi que nous exploitons ensuite sa méthode héritée getfolder, avec le chemin d'accès en paramètre pour initialiser (Set) l'objet leDossier. C'est lui désormais qui permet de piloter le dossier spécifié par l'utilisateur.

Parcourir les fichiers
Maintenant que le dossier est représenté par un objet VBA, nous pouvons parcourir la collection de ses fichiers en engageant l'objet chaqueFichier, déclaré à cet effet, dans une boucle For Each.
  • Toujours à la suite dans l'instruction conditionnelle, créer la boucle For Each suivante :
...
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(chemin)
For Each chaqueFichier In leDossier.Files
ActiveSheet.Cells(compteur, 3).Value = chaqueFichier.Name
compteur = compteur + 1
Next chaqueFichier

End If
...


Nous parcourons chaque fichier dans la collection des fichiers (Files) du dossier désigné (leDossier). Pour chacun, nous inscrivons le nom (chaqueFichier.Name), dans la colonne C (3) pour l'indice en cours (compteur) qui débute à partir de la ligne 7 et qui progresse à chaque passage (compteur = compteur + 1).

Décharger les objets
Pour parfaire le développement de cette première procédure, nous devons détruire les objets de programmation qui ne sont plus utilisés. Ainsi, nous libèrerons proprement la mémoire de l'ordinateur.
  • Après l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
End If

Set boite = Nothing
Set chaqueFichier = Nothing
Set objetFichier = Nothing
Set leDossier = Nothing


End Sub
...


C'est en réinitialisant (Set) chaque objet à Nothing que nous les détruisons tour à tour.

Nous pouvons d'ores et déjà tester ce premier code.
  • Enregistrer les modifications (CTRL + S) et basculer sur la feuille Excel (ALT + Tab),
  • Cliquer sur le premier bouton à l'icône du dossier,
  • Dans la boîte de dialogue, ouvrir le sous dossier archives_factures et valider par Ok,
Récupérer tous les fichiers d-un dossier en VBA Excel

Comme vous pouvez l'apprécier, tous les noms de fichiers du dossier ainsi désigné, sont effectivement listés en colonne C, à partir de la ligne 7. Dans le même temps, le chemin d'accès au dossier est bien rappelé en cellule fusionnée à partir de C3.

Le dossier de destination
Nous devons maintenant nous attaquer au second bouton. Son code est sensiblement identique puisqu'il est question de désigner un dossier de destination. Mais des différences de taille existent néanmoins, dans la mesure où nous devons y entreprendre des actions comme la copie ou le déplacement des fichiers, issus du premier dossier. Nous proposons tout d'abord d'y répliquer le code VBA que nous venons d'aboutir.
  • Revenir dans l'éditeur VBA Excel,
  • Copier (CTRL + C) tout le code VBA situé à l'intérieur des bornes de la procédure source,
  • Puis, le coller (CTRL + V) dans les bornes de la procédure cible,
Destination et cible
Pour entreprendre la copie ou le déplacement des fichiers d'un dossier à un autre, nous devons déclarer des variables les représentant.
  • Dans la partie déclarative, ajouter les deux déclarations suivantes :
...
Dim boite As FileDialog: Dim chemin As String
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
Dim dep As String: Dim fin As String: Dim compteur As Byte
...


Il s'agit de deux variables textuelles destinées à représenter les chemins d'accès respectifs.

Nettoyer la plage de réception
Ensuite, ce n'est plus la plage en colonne C qui doit être réinitialisée de ses potentielles précédentes importations, mais la plage en colonne E pour les fichiers déportés. Nous devons donc adapter l'instruction la mettant en oeuvre dans les initialisations.
  • Après les variables, ajouter l'initialisation suivante, comme suit :
...
compteur = 7
ActiveSheet.Range("E7:E30").Value = ""
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then chemin = boite.SelectedItems(1)
...


Les chemins menant aux dossiers
Maintenant, une fois que le chemin est désigné, nous devons reconstruire les adresses menant à la source et à la cible dans les deux variables que nous avons déclarées à cet effet.
  • Dans l'instruction conditionnelle, adapter les deux premières lignes par les quatre suivantes :
...
ActiveSheet.Cells(4, 3).Value = chemin
ActiveSheet.Cells(6, 5).Value = "Cible :" & Mid(chemin, InStrRev(chemin, "\") + 1)
fin = chemin & "\"
dep = ActiveSheet.Cells(3, 3).Value & "\"

...


Nous inscrivons le chemin cible en cellule C4 (Cells(4, 3)). Nous réaffectons le nom du dossier concerné en cellule E6 (Cells(6, 5)). Nous mémorisons le chemin d'accès au dossier de destination suivi d'un antislash (fin = chemin & "\"), pour bien entrer dans le sous-dossier. Nous faisons de même pour le sous-dossier source en le prélevant depuis la cellule C3 (ActiveSheet.Cells(3, 3).Value & "\").

Le dossier à parcourir
Bien que cette seconde boîte de dialogue permette de désigner un dossier de destination, ce sont bien les fichiers du dossier source que nous devons encore une fois parcourir. En effet, ce sont eux que nous devons copier ou déplacer.
  • Adapter le code pour manipuler les fichiers et les dossiers, comme suit :
...
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(ActiveSheet.Cells(3,3).Value)
For Each chaqueFichier In leDossier.Files
...


De cette manière, c'est bien le chemin d'accès au premier dossier, mémorisé en celluleC3 (Cells(3, 3)), que nous passons à la méthode getfolder.

Copier ou déplacer
Enfin, à chaque passage dans la boucle, c'est désormais un traitement que nous devons entreprendre. Si la première case est cochée sur la feuille, les fichiers du premier dossier doivent être copiés dans le second. Cette première case se nomme copier. Si la seconde case est cochée sur la feuille, les fichiers du premier dossier doivent être déplacés dans le second. Donc, ils doivent disparaître du dossier source. Cette seconde case se nomme deplacer. Ce sont des méthodes héritées par l'objet objetFichier, ayant instancié la classe des fichiers et dossiers, qui permettent de réaliser ces actions.
  • Adapter le code de la boucle For Each, comme suit :
...
For Each chaqueFichier In leDossier.Files
If ActiveSheet.copier.Value = True Then
objetFichier.CopyFile dep & chaqueFichier.Name, fin & chaqueFichier.Name
ActiveSheet.Cells(compteur, 5).Value = ActiveSheet.Cells(compteur, 3).Value
Else
objetFichier.MoveFile dep & chaqueFichier.Name, fin & chaqueFichier.Name
ActiveSheet.Cells(compteur, 5).Value = ActiveSheet.Cells(compteur, 3).Value
ActiveSheet.Cells(compteur, 3).Value = ""
End If

compteur = compteur + 1
Next chaqueFichier
...


Ce sont donc les méthodes héritées CopyFile et MoveFile qui permettent respectivement de copier et de déplacer des fichiers. Elles attendent les mêmes paramètres. Il s'agit tout d'abord du chemin d'accès complet au fichier à copier ou à déplacer. Il s'agit ensuite du chemin d'accès complet au fichier dans sa destination. Cela signifie que nous pourrions le renommer à la volée. Ici, nous conservons son nom d'origine. Il ne doit pas déjà exister, sinon une erreur serait générée. Mais nous avions déjà appris à tester l'existence de fichiers en VBA. Les adaptations sont terminées. Il est temps de tester le code VBA.
  • Enregistrer les modifications (CTRL + S) et revenir sur la feuille Excel (ALT + Tab),
  • Cocher la seconde case (Déplacer),
  • Cliquer sur le premier bouton à l'icône d'un dossier,
  • Dans la boîte de dialogue, désigner le sous dossier archives_factures,
  • De retour sur la feuille, cliquer sur le second bouton à l'icône d'un dossier,
  • En haut à gauche, cliquer sur le bouton Nouveau dossier,
  • Le nommer Sauvegarde par exemple, entrer dedans et valider,
Créer un nouveau dossier pour déplacer des fichiers en VBA Excel

De retour sur la feuille, vous constatez que les informations de la colonne C disparaissent au profit de la colonne E.

Code VBA Excel pour déplacer des fichiers d-un dossier à un autre au clic sur un bouton

Effectivement, si vous ouvrez le sous dossier Sauvegarde dans l'explorateur Windows, vous constatez la présence des fichiers PDF. Si vous ouvrez le sous dossier archives_factures, vous remarquez qu'il est désormais vide. Les fichiers n'ont donc pas été copiés. Ils ont été déplacés, comme nous l'avons demandé. Mais si nous avions coché la première case, nous aurions constaté la présence de ces factures, aussi bien dans le sous dossier source que dans le sous dossier cible.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn