Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Copier tous les fichiers d'un dossier
Nous savons déjà instancier une certaine classe qui permet de
manipuler les fichiers et dossiers du disque, par exemple pour parcourir tous les éléments d'un répertoire. Ici, nous allons redonner du service à cette classe pour permettre de
copier ou de
déplacer tous les fichiers d'un dossier vers un autre emplacement. Cette technique est intéressante en outre pour sécuriser des informations précieuses à archiver dans des lieux secrets.
Base de données Access à télécharger
Pour découvrir cette nouvelle astuce, nous proposons d'agir à partir d'une
base de données abritant un
formulaire accueillant quelques contrôles déjà en place.
Comme vous pouvez le voir, la décompression livre le
fichier de la base de données accompagné d'un
sous dossier, nommé
bdd. Ce dossier héberge quelques
bases de données Access. C'est sur lui que nous exercerons les manipulations pour vérifier que nous sommes en mesure de
copier ou de
déplacer tous les éléments d'un dossier.
- Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
- Cliquer sur le bouton Activer le contenu du bandeau de sécurité,
- Puis, dans le volet de navigation, double cliquer sur le formulaire fParcourir pour l'exécuter,
Deux premiers boutons sont matérialisés par l'icône d'un dossier. Bien sûr, ils sont encore inopérants à ce stade. Le premier doit permettre de désigner le
dossier à copier, par le biais d'une
boîte de dialogue standard d'Office. Le second doit permettre de définir le
dossier de réception, de la même façon. Un
groupe d'options ou
cases à cocher, permet de choisir l'action. Est-ce que le dossier cible doit être
dupliqué ou
déplacé ? Enfin, un dernier bouton doit permettre de réaliser cette
copie ou ce
déplacement, en fonction du choix émis en amont.
La référence à Microsoft Office
Avant toute chose, une librairie doit être ajoutée au projet pour pouvoir piloter les
boîtes de dialogue standard d'Office.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans les propositions, choisir le Mode création,
Ainsi, nous basculons dans la vue en conception du formulaire.
- Réaliser le raccourci clavier ALT + F11 pour afficher l'éditeur VBA Access,
- En haut de l'éditeur, cliquer sur le menu Outils,
- Dans les propositions, cliquer sur la rubrique Références,
Si elle n'est pas déjà attachée au projet, vous devez cocher la case
Microsoft Office 16.0 Object Library. Le numéro (ici 16.0) dépend de la version d'Office que vous utilisez.
- Cliquer sur le bouton Ok de la boîte de dialogue pour valider cette intégration,
Les variables publiques
Maintenant, nous avons besoin de
variables publiques pour mémoriser les chemins que devra exploiter la procédure attachée au bouton final pour la copie. En effet, les
variables publiques stockent des données au-delà de la durée de vie des procédures événementielles.
- Dans la page de code, sous l'instruction Option Explicit, déclarer les variables suivantes :
Option Compare Database
Option Explicit
Dim ch_depart As String: Dim ch_fin As String
Dim boite As FileDialog
Chaque variable est explicitement nommée. Les deux premières doivent stocker le
chemin de départ et celui d'
arrivée pour réaliser la
copie ou le
déplacement. La troisième est un
objet de type
FileDialog. Sa déclaration est rendue possible par la
référence ajoutée au
projet VBA Access. Néanmoins et nous le verrons, pour exploiter ces
boîtes de dialogue standards, en l'occurrence ici celle pour désigner des dossiers, nous serons obligés d'
instancier une classe précise.
Le dossier cible
Et précisément, il est temps d'exploiter cette
classe pour hériter des propriétés et méthodes permettant de donner vie à cette fameuse
boîte de dialogue. Tout d'abord, nous proposons de stocker en mémoire le
dossier de départ, après avoir demandé à l'utilisateur de le désigner.
- Revenir sur le formulaire en conception (ALT + Tab),
- Cliquer sur le premier bouton à l'icône du dossier,
En consultant sa
feuille de propriétés, vous remarquez qu'il est nommé
depart.
- Dans cette feuille de propriétés, activer l'onglet Evénement,
- Dès lors, cliquer sur le bouton associé à son événement nommé Au clic,
- Dans la boîte de dialogue, choisir le Générateur de code et valider par Ok,
C'est ainsi que nous retournons dans l'
éditeur VBA Access, mais cette fois entre les bornes de la
procédure événementielle depart_Click.
- Dans cette procédure, ajouter les instructions VBA suivantes :
Private Sub depart_Click()
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then ch_depart = boite.SelectedItems(1)
Set boite = Nothing
End Sub
Grâce à la
propriété FileDialog de l'
objet Application et grâce à son paramètre
msoFileDialogFolderPicker, nous initialisons (Set) notre
objet boite sur une
boite de dialogue permettant de naviguer au travers des
dossiers du disque. Avec sa
méthode héritée Show, nous l'affichons à l'écran. Puis, nous récoltons le dossier désigné par l'utilisateur dans la
variable publique ch_depart, grâce à la
collection héritée SelectedItems de l'
objet boite. Comme nous n'avons pas réglé de propriété pour permettre la multi-sélection de dossiers, nous savons qu'un seul a été choisi. C'est ainsi que nous le désignons (1) en paramètre de la collection. Enfin, nous réinitialisons (Set) l'objet Ã
Nothing, dès lors qu'il n'est plus utilisé, pour le
vider de la mémoire et coder proprement.
Le dossier de destination
Pour mémoriser le
chemin de destination, le procédé est bien sûr identique. Seule la variable à affecter change.
- Revenir sur le formulaire en conception,
- Cliquer sur le second bouton associé à l'icône d'un dossier,
- Cliquer sur le petit bouton associé à son événement Au clic dans la feuille de propriétés,
- Dans les propositions, choisir le Générateur de code et valider par Ok,
Nous revenons dans l'
éditeur VBA Access mais cette fois entre les bornes de la
procédure événementielle arrivee_Click.
- Dans cette procédure, coller et adapter les instructions VBA suivantes :
Private Sub arrivee_Click()
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then ch_fin = boite.SelectedItems(1)
Set boite = Nothing
End Sub
Cette fois et comme nous l'annoncions, selon le même protocole, c'est bien le
chemin de destination que nous mémorisons dans la
variable nommée
ch_fin.
Dupliquer le dossier
Puisque nous connaissons désormais l'emplacement de départ et celui d'arrivée, il est temps de procéder au déplacement ou à la copie des données. Pour cela, nous devons commencer par
instancier la classe permettant de manipuler les
fichiers et les dossiers du disque. Et comme vous le savez, nous allons encore une fois exploiter la précieuse
fonction VBA CreateObject avec un argument dédié.
- Revenir sur le formulaire en conception,
- Cliquer sur le bouton intitulé Agir pour le sélectionner,
- Dans la feuille de propriétés, cliquer sur le petit bouton associé à son événement Au clic,
- Dans la boîte de dialogue, choisir le générateur de code et valider par le bouton Ok,
Nous revenons une fois encore dans l'
éditeur VBA Access, cette fois entre les bornes de la
procédure événementielle agir_Click.
- Dans cette procédure, ajouter les instructions VBA suivantes :
...
Dim dossier As Object
If ch_depart <> "" And ch_fin <> "" Then
Set dossier = CreateObject("Scripting.FileSystemObject")
dossier.CopyFolder ch_depart, ch_fin
...
Nous déclarons tout d'abord un objet destiné à piloter les
dossiers du disque. Grâce à une
instruction conditionnelle double (And), nous vérifions que les deux chemins sont correctement renseignés. Si le test est un succès, grâce à la fameuse
fonction VBA CreateObject, nous instancions la classe permettant de prendre possession des fichiers et dossiers du système. C'est ainsi que nous initialisons (Set) notre
variable dossier. Grâce à sa
méthode héritée CopyFolder, nous entreprenons la
copie des données en fonction des chemins mémorisés dans les deux variables respectives.
Copier ou déplacer
Bien que l'action soit déjà entreprise et finalisée grâce à la
méthode CopyFolder, il nous reste à savoir si l'utilisateur souhaite créer une
copie du dossier ou le déplacer. Tout dépend de la case qu'il a cochée sur le formulaire. Ce groupe d'option se nomme
action. Si la seconde case est cochée (Valeur 2), le dossier de départ doit être éliminé. Dans le cas contraire, aucune autre démarche ne doit être entreprise.
- A la suite du code, ajouter les instructions VBA suivantes :
...
If action.Value = 2 Then dossier.DeleteFolder ch_depart, True
MsgBox "Les données ont bien été transférées."
Else
MsgBox "Les deux dossiers doivent être spécifiés."
End If
Set dossier = Nothing
...
Si laseconde case est cochée (action.Value = 2), après avoir effectué la copie, nous procédons à la destruction du dossier d'origine grâce à la
méthode héritée DeleteFolder de l'
objet dossier. Suite à cela, nous finalisons la première instruction conditionnelle pour spécifier le cas échéant, soit quand les deux dossiers n'ont pas été définis (Les deux dossiers doivent être spécifiés.).
Il est temps de tester.
- Revenir sur le formulaire en conception,
- L'exécuter avec la touche F5 du clavier,
- Cliquer sur le premier bouton à l'icône du dossier,
- Avec la boîte de dialogue, désigner le sous dossier de l'application locale,
- Cliquer alors sur le second bouton à l'icône du dossier,
- Avec la boîte de dialogue, désigner un dossier de destination,
- Puis, cliquer sur le bouton Agir du formulaire,
Maintenant, si vous ouvrez l'explorateur Windows à l'emplacement défini, vous constatez que toutes les données du dossier de départ ont bien été copiées dans la destination. Si vous réalisez la même opération en cochant la seconde case, vous constatez que toutes les informations source ont bien été déplacées. En effet, le dossier de début n'existe plus.