Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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 .
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 ,
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,
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,
De retour sur la feuille, vous constatez que les informations de la colonne C disparaissent au profit de la colonne E.
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.