Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Enrichir une table avec un dossier
Dans une formation passée, nous avions appris à générer automatiquement un
diaporama PowerPoint en fonction des informations contenues dans une
table Access et tout cela, grâce au
code VBA . Mais la question qui se posait était de savoir comment
enrichir dynamiquement la table elle-même, pour que le diaporama évolue automatiquement. C'est le cas que nous proposons de résoudre ici.
Base de données Access à télécharger
Pour le développement de la solution, nous devons tout d'abord récupérer les travaux qui avaient permis de générer ces diaporamas dynamiques.
Comme vous pouvez le voir, le
fichier de la base de données est accompagné de deux sous dossiers. Ils hébergent des photos destinées à nourrir les
diaporamas à générer.
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é,
Dans le volet de navigation, double cliquer sur le formulaire fExport pour l'exécuter,
Ce
formulaire offre
deux boutons . Le premier doit permettre à l'utilisateur de désigner un
dossier contenant des
photos . Dès lors, le
code VBA Access doit remplir la
table archives avec les
titres et
noms de fichiers de ces
photos . Le deuxième bouton est déjà fonctionnel puisqu'issu d'un développement précédent. Mais il est en attente d'une information. Il s'agit du
chemin d'accès au dossier choisi pour lancer la
génération du diaporama en fonction des données archivées dans la table.
La variable publique
Pour débuter, nous avons besoin d'une
variable publique capable de mémoriser le
chemin d'accès au dossier choisi, pour qu'il puisse être transmis entre les deux procédures associées aux deux boutons.
A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans les propositions, choisir le mode Création ,
Nous basculons ainsi dans la vue en conception du formulaire.
Réaliser le raccourci clavier ALT + F11 pour afficher l'éditeur VBA Access ,
En haut de la feuille de code, après les deux premières instructions, ajouter la ligne suivante :
Option Compare Database
Option Explicit
Dim chemin As String
Private Sub Parcourir_Click()
...
La procédure et ses variables
Maintenant, nous devons déclencher un code au clic sur le premier bouton du formulaire. Son rôle sera notamment de
purger la table pour pouvoir y insérer les nouvelles informations, relatives aux fichiers contenus dans le dossier désigné. Mais pour cela, nous devons commencer par
déclarer les variables utiles.
Revenir sur le formulaire en conception,
Cliquer sur le premier bouton pour le sélectionner,
Activer l'onglet Evénement de sa feuille de propriétés ,
Cliquer alors sur le petit bouton associé à son événement Au clic ,
Dans la boîte de dialogue qui suit, choisir le Générateur de code et valider par Ok,
De cette manière, nous revenons dans l'
éditeur VBA Access mais cette fois, entre les bornes de la
procédure événementielle cible_Click .
cible est le nom du bouton. Ce code se déclenchera au clic sur ce dernier.
Dans les bornes de cette procédure, ajouter les déclarations de variables suivantes :
...
Dim chemin As String
Private Sub cible_Click()
Dim boite As FileDialog
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
Dim base As Database: Dim requete As String: Dim nomFichier As String
...
Tout d'abord et sachez-le, les
références Ã
PowerPoint et
Office sont déjà attachées au projet. Pour le constater, il vous suffit de déployer le
menu Outils et de choisir la rubrique
Références . Nous déclarons tout d'abord un
objet de type FileDialog pour instancier par la suite la
classe des boîtes de dialogue Office standard . C'est grâce à cet objet que nous offrirons à l'utilisateur une boîte de dialogue lui permettant de désigner un
dossier du disque . Ensuite, nous déclarons
trois variables objets (As Object). Elles serviront à manipuler les
fichiers et les dossiers du système pour notamment
parcourir tous les fichiers contenus dans le
dossier choisi par l'utilisateur. Puis, nous déclarons une
variable de base de données (As Database) pour prendre possession de la
base de données en cours . En effet, grâce à la variable qui suit (requete), nous allons construire une
requête , à exécuter en boucle, pour insérer les informations des fichiers récoltés dans la table source. Enfin, la
variable nomFichier sera utilisée pour mémoriser les noms des fichiers parcourus, purgés de leurs caractères illicites.
Initialiser les objets
Nous pouvons maintenant initialiser certaines variables notamment pour prendre possession de la base de données en cours, des boîtes de dialogue standard et des fichiers et dossiers du disque.
Après la déclaration des variables, ajouter les instructions VBA suivantes :
...
Set base = CurrentDb()
requete = "DELETE * FROM archives"
base.Execute requete
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then chemin = boite.SelectedItems(1)
If chemin <> "" Then
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(chemin)
End If
...
Tout d'abord, grâce à la
fonction VBA Access CurrentDb , nous initialisons (Set) l'
objet base sur la
base de données en cours . Dès lors, avec la
méthode héritée Execute , nous déclenchons une
requête suppression sur la
table archives pour la vider de tous ses enregistrements.
Ensuite, nous exploitons la
propriété FileDialog de l'
objet Application avec le
paramètre msoFileDialogFolderPicker pour initialiser (Set) l'
objet boite . C'est ainsi qu'il hérite des propriétés et méthodes pour piloter les
boîtes de dialogue standards permettant de naviguer au travers des
dossiers du disque . Avec sa
méthode héritée Show , nous l'affichons à l'écran. Avec sa
collection SelectedItems , nous récupérons le (1) dossier choisi par l'utilisateur.
Puis, nous testons si le chemin a bien été défini (If chemin <> "" Then) avant d'instancier (CreateObject) la classe permettant de manipuler les
fichiers et les
dossiers (scripting.filesystemobject). Dès lors, la
variable objetFichier offre la
méthode GetFolder pour permettre à la
variable leDossier de représenter le répertoire dont le chemin est passé en paramètre de la méthode.
Parcourir les fichiers du dossier
Grâce à ces déclarations et initialisations, nous sommes désormais en mesure de passer en revue tous les fichiers du dossier choisi. Pour cela, nous avons besoin d'une
boucle For Each .
A la suite, dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
For Each chaqueFichier In leDossier.Files
If (Right(chaqueFichier, 4) = ".jpg") Then
nomFichier = Mid(Replace(Replace(chaqueFichier.Name, "-", " "), ".jpg", ""), 4)
nomFichier = UCase(Left(nomFichier, 1)) & Mid(nomFichier, 2)
End If
Next chaqueFichier
...
Grâce à la
variable objet chaqueFichier , nous parcourons la
collection des fichiers (Files) contenus dans le dossier désigné par l'utilisateur (leDossier). Nous vérifions tout d'abord que l'
extension est bien celle d'une image en contrôlant les
quatre derniers caractères (Right(chaqueFichier, 4) = ".jpg"). Nous exploitons la
fonction Mid pour sauter les quatre premiers numéros en préfixe. Avec l'imbrication des
fonctions Replace , nous remplaçons les tirets par des espaces et nous supprimons l'extension. Nous exploitons ensuite la
fonction UCase pour passer la première lettre du nom (Left(nomFichier, 1)) en majuscule, tout en conservant le reste en minuscules (Mid(nomFichier, 2)).
Ajouter les données de fichiers dans la table
Chacun de ces fichiers doit maintenant être inséré tour à tour dans la
table archives avec le nom de l'image qui l'accompagne. En effet, la
table archives est faite de deux champs,
a_titre et
a_image plus le champ de la clé primaire qui s'incrémente automatiquement. Nous devons donc exécuter une classique
requête ajout sur cette table.
A la suite du If de la boucle For Each, ajouter les deux lignes VBA suivantes :
...
requete = "INSERT INTO archives (a_titre, a_image) VALUES ('" & nomFichier & "','" & chaqueFichier.Name & "')"
base.Execute requete
...
Dans la
table archives , pour les
champs a_titre et
a_image , nous insérons le
nom de fichier retravaillé avec le nom originel du
fichier image . Puis, nous exécutons cette requête grâce à la
méthode Execute de l'
objet base qui désigne la base de données en cours. Comme cette action est produite dans la
boucle For Each sur chaque fichier, nous devrions obtenir l'archivage des informations de tous les fichiers contenus dans le dossier désigné.
Libérer les ressources
Le
code VBA est terminé mais il nous reste encore Ã
détruire les variables objets qui ne sont plus utilisées, pour libérer la mémoire.
Après l'instruction conditionnelle parente, ajouter les lignes VBA suivantes :
...
End If
base.Close
Set base = Nothing
Set objetFichier = Nothing
Set leDossier = Nothing
Set chaqueFichier = Nothing
End Sub
La
méthode Close de l'
objet base permet de fermer proprement l'instance de la base de données ouverte. Ensuite et classiquement, c'est la réinitialisation (Set) de chaque objet Ã
Nothing qui permet de les détruire tour à tour.
Il est temps de tester le code.
Enregistrer les modifications (CTRL + S) et revenir sur le formulaire (ALT + Tab),
Exécuter ce dernier en enfonçant la touche F5 du clavier,
Désigner par exemple le sous dossier sources livré avec le fichier compressé et valider,
Maintenant, si vous ouvrez la
table archives , vous constatez que toutes les informations retravaillées des fichiers présents dans le sous dossier, ont bien été importées.
Si vous copiez les trois photos du dossier sources_bis dans le sous dossier sources et que vous réitérez le processus, vous constatez effectivement que toutes les nouvelles données sont bien archivées dans la table, avec les anciennes.
Enfin, si vous lancez le diaporama en cliquant sur le second bouton du formulaire, il intègre bien évidemment toutes les données archivées pour créer dynamiquement une présentation à partir des photos du dossier, sans en oublier aucune.