Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Générer un diaporama en VBA Access
A l'occasion d'une astuce précédente, nous avons appris Ã
lancer des présentations PowerPoint , depuis un
formulaire Access par le
code VBA . Ici, nous allons plus loin. A partir d'éléments archivés dans une table, nous souhaitons générer automatiquement un
diaporama PowerPoint .
La
table Access illustrée par la capture archive des titres de photos avec leurs
noms de fichiers . Ces fichiers sont stockés dans un sous dossier local de l'application.
Dès lors, s'il clique sur le
bouton d'un formulaire , toutes ces informations sont consolidées pour générer un
diaporama PowerPoint qui est lancé automatiquement, à l'issue du traitement par le
code VBA Access .
Une diapositive est créée par photo. L'image est placée en arrière-plan tandis que son titre est inscrit dans une zone de texte positionnée sur la partie supérieure.
Base de données Access à télécharger
Pour développer cette solution, nous suggérons d'appuyer l'étude sur une
base de données offrant ces informations et accompagnée des photos dans un sous-dossier.
Comme vous pouvez le voir, la décompression livre effectivement le
fichier de la base de données , accompagné d'un
sous dossier nommé
sources .
Il héberge les
photos dont les noms de fichiers sont archivés dans la table.
Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access ,
Cliquer alors sur le bouton Activer le contenu du bandeau de sécurité,
Puis, double cliquer sur le formulaire fExport depuis le volet de navigation, sur la gauche,
Ainsi, nous l'exécutons. Il est très épuré. Il propose simplement un gros bouton destiné à lancer la génération du
diaporama PowerPoint .
La référence à PowerPoint
Durant ce développement, nous allons manipuler des objets et attributs particuliers, appartenant au
VBA PowerPoint . C'est la raison pour laquelle nous devons ajouter sa
référence au projet , avant de coder.
A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans les propositions, choisir le mode Création ,
Sur le formulaire en conception, cliquer sur le bouton pour le sélectionner,
Dès lors, activer l'onglet Evénement de sa feuille de propriétés ,
Cliquer ensuite 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,
Nous basculons ainsi dans l'
éditeur VBA Access entre les bornes de la
procédure événementielle Parcourir_Click .
En haut de l'éditeur, cliquer sur le menu Outils ,
Dans les propositions, choisir la rubrique Références ,
Dans la boîte de dialogue, cocher la case Microsoft PowerPoint 16.0 Object Library ,
Grâce à elle, nous allons pouvoir profiter de tous ses objets de développement.
Cliquer sur le bouton Ok pour revenir sur la feuille de code,
La déclaration des variables
Il est temps maintenant de mettre les mains dans le code. Et bien entendu, nous devons commencer par
déclarer les variables nécessaires au développement. Nous avons notamment besoin d'
objets pour piloter les
enregistrements de la base de données mais aussi pour manipuler une
instance de PowerPoint .
Dans les bornes de la procédure, ajouter les déclarations de variables suivantes :
...
Dim base As Database: Dim enr As Recordset
Dim instanceP As Object: Dim diapo As Slide
Dim nomP As String: Dim titreP As String
Dim compteur As Byte
...
L'
objet base doit pointer sur la
base de données en cours . Grâce à lui, l'
objet enr pourra manipuler ses
enregistrements . L'
objet instanceP doit instancier la
classe de PowerPoint . C'est ainsi que nous pourrons manier ses
diapositives . C'est la raison pour laquelle, nous déclarons l'
objet diapo en tant que tel (As Slide). Nous stockerons chaque
nom de fichier et chaque
titre de photo dans les
variables respectives
nomP et
titreP . Enfin, nous utiliserons la
variable compteur , pour incrémenter le
numéro des diapositives à créer, à chaque
nouvel enregistrement étudié par le
code VBA Access .
Initialiser les variables objets
Puisque ces objets existent désormais, nous devons les initialiser.
A la suite du code VBA, ajouter les affectations suivantes :
...
Set base = CurrentDb()
Set enr = base.OpenRecordset("archives")
Set instanceP = CreateObject("PowerPoint.Application")
instanceP.Presentations.Add
compteur = 1
...
C'est la
fonction CurrentDb qui permet de pointer sur la
base de données en cours . Et c'est ainsi que l'
objet base hérite des propriétés et méthodes pour la manipuler. Pour preuve dans l'enchaînement, nous initialisons (Set) l'
objet enr grâce à sa
méthode OpenRecordset . Nous lui passons le
nom de la table cible en paramètre (archives). Désormais, l'
objet enr dispose également des propriétés et méthodes pour prendre possession des
enregistrements de cette
table . Ensuite, nous exploitons la
fonction VBA CreateObject , pour
instancier la classe de PowerPoint . Et dans l'enchaînement, nous exploitons la
méthode Add ainsi héritée pour créer une
nouvelle présentation PowerPoint . Enfin, nous calons le
numéro de la diapositive sur la première (compteur=1).
Parcourir les enregistrements de la table
Pour pouvoir créer
une diapositive par photo , nous devons être en mesure de
parcourir chaque enregistrement de la table . A chaque passage dans la
boucle , il sera question de récolter le
titre et le
nom de fichier pour pouvoir les greffer sur une
nouvelle diapositive à créer.
A la suite du code VBA , créer la boucle suivante :
...
enr.MoveFirst
Do
titreP = enr.Fields("a_titre").Value
nomP = CurrentProject.Path & "\sources\" & enr.Fields("a_image").Value
compteur = compteur + 1
enr.MoveNext
Loop Until enr.EOF
...
Grâce à la
méthode MoveFirst de l'
objet enr , nous plaçons tout d'abord le pointeur de lecture sur le
premier enregistrement de la table . Dès lors, nous engageons une
boucle (Do...Loop) pour les parcourir tous jusqu'au dernier (Until enr.EOF). Nous stockons alors le titre en cours dans la
variable titreP . Puis, nous reconstruisons le
chemin d'accès dans la
variable nomP . Les deux champs respectifs dans la table se nomment effectivement
a_titre et
a_image . Et comme nous en avons l'habitude, c'est la
propriété Path de l'
objet CurrentProject qui renvoie le
chemin d'accès à l'application locale . De plus, à chaque passage et par anticipation, nous incrémentons le
numéro de la prochaine diapositive à créer. Et surtout, nous n'oublions pas de placer le pointeur de lecture sur l'
enregistrement suivant , grâce à la
méthode MoveNext de l'
objet enr .
Créer les diapositives
Désormais, grâce à l'
instance de PowerPoint , nous allons pouvoir exploiter une
méthode d'une
collection précise pour
initialiser l'objet diapo qui rappelons-le, doit représenter une
diapositive fraichement créée.
Dans les bornes de la boucle, avant la variable compteur, ajouter les instructions suivantes :
...
Set diapo = instanceP.ActivePresentation.Slides.Add(compteur, ppLayoutTitle)
With diapo.Shapes(1)
With .TextFrame.TextRange
.Text = titreP
.Font.Size = 40
.Font.Color.RGB = RGB(81, 81, 81)
End With
.TextFrame.AutoSize = ppAutoSizeShapeToFitText
.Left = 20
.Top = 20
.Fill.BackColor.RGB = RGB(231, 231, 231)
.Line.Weight = 4
.Line.ForeColor.RGB = RGB(81, 81, 81)
End With
...
Grâce à l'
instance de PowerPoint , nous pouvons pointer sur la
présentation (ActivePresentation) créée juste avant. Dès lors, nous exploitons sa
collection Slides , représentant les
diapositives , pour en
créer une nouvelle grâce à sa
méthode Add . En paramètres, nous précisons le
numéro de la diapositive (compteur) pour son emplacement, ainsi que le
modèle utilisé (ppLayoutTitle). Avec cette valeur, nous créons une
nouvelle diapositive dotée d'une
zone de titre et d'une
zone de sous-titre . Comme cette création est engagée dans la boucle parcourant les enregistrements de la table, il est important de comprendre qu'une nouvelle diapositive sera créée pour chaque photo parcourue dans cette table.
Dès lors, nous paramétrons la
première zone de texte (Shapes(1)) de cette nouvelle diapositive. Pour optimiser le code et afin de ne pas répéter les objets parents et enfants, nous imbriquons plusieurs
blocs With . L'objectif est de conserver une lecture et une compréhension simples. Nous réglons tout d'abord le
contenu de la zone de texte (With.TextFrame.TextRange) en définissant le
titre à afficher (titreP) et en paramétrant la
taille et la
couleur de police (Font.Size et .Font.Color).
Ensuite, nous opérons des réglages fort classiques sur la
zone de texte . Elle doit s'ajuster à son contenu (.TextFrame.AutoSize = ppAutoSizeShapeToFitText). Nous réglons l'emplacement en haut à gauche (.Left= 20 et .Top = 20) de la diapositive. Nous définissons la couleur de fond ainsi que l'épaisseur de la bordure et sa couleur.
Ajouter la photo en arrière-plan
Nous devons maintenant
ajouter la photo dont l'enregistrement est en cours de lecture, en arrière-plan de la diapositive. C'est encore la méthode d'une collection qui permet de résoudre le cas.
A la suite du code de la boucle, après le dernier End With, ajouter les instructions suivantes :
...
diapo.Shapes(2).Delete
diapo.Shapes.AddPicture nomP, False, True, 0, 0, instanceP.ActivePresentation.PageSetup.SlideWidth, instanceP.ActivePresentation.PageSetup.SlideHeight
instanceP.ActivePresentation.Slides(compteur).Shapes("Image4").ZOrder 1
Set diapo = Nothing
...
Une présentation avec le modèle que nous avons créé, génère toujours une
diapositive avec une
zone de titre et une
zone de sous titre . Nous supprimons donc tout d'abord la seconde (Delete). Ensuite, nous exploitons la
méthode AddPicture de la
collection Shapes qui représente les formes géométriques de la diapositive. Nous définissons le chemin d'accès (nomP). Les deux paramètres qui suivent (False et True) indiquent respectivement que l'image ne doit pas être liée à la source et qu'elle doit être incorporée à la présentation. Nous déterminons ensuite qu'elle doit être collée sur les bords gauche et haut (0,0). En effet, nous paramétrons sa largeur (SlideWidth) et sa hauteur (SlideHeight) sur celles de la diapositive.
Dans ce type de présentation, l'image ainsi ajoutée est considérée comme le quatrième élément. Sa zone porte forcément le
nom Image4 . C'est ainsi que nous l'atteignons grâce à la
collection Shapes (Shapes("Image4")) de la
collection Slides qui nous permet de pointer sur la
diapositive en cours (Slides(compteur)). Dès lors, nous réglons son
attribut ZOrder . Avec la
valeur 1 , nous la glissons en arrière-plan, soit sous le titre. Enfin, nous détruisons l'objet de la diapositive (Set diapo = Nothing), pour pouvoir en créer une nouvelle au prochain passage dans la boucle, donc pour la photo suivante.
Lancer le diaporama
Il ne nous reste plus qu'Ã
détruire les objets de base de données mais aussi et bien sûr Ã
lancer le diaporama de la présentation ainsi générée. Ces actions doivent intervenir à l'issue du traitement, soit
après la boucle .
Après le Loop de la boucle Do, ajouter les instructions VBA suivantes :
...
enr.Close
base.Close
Set enr = Nothing
Set base = Nothing
instanceP.ActivePresentation.SlideShowSettings.Run
...
C'est tout simplement la
méthode Run de la
propriété SlideShowSettings pour la
présentation en cours qui permet de déclencher l'
exécution du diaporama .
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
L'exécuter par exemple avec la touche F5 du clavier,
Puis, cliquer sur son bouton,
Vous voyez la présentation se construire très rapidement avec toutes ses diapositives. Dans l'enchaînement, le diaporama est effectivement lancé. Désormais, à chaque clic sur la diapositive en cours, c'est la suivante qui la remplace et ce, jusqu'à la dernière, celle des terres ocres du Lubéron. Certes, nous aurions aussi pu définir un minutage par le code pour un défilement automatique. Mais ce que nous souhaitons vérifier maintenant est important. Ce diaporama est il vraiment dynamique et évolutif. Pour le savoir, nous proposons d'ajouter une photo dans la table de la base de données. Il s'agit de la dernière du sous dossier. Elle n'est effectivement pas mentionnée dans les enregistrements.
Quitter le diaporama en enfonçant la touche Echap du clavier,
Fermer la présentation PowerPoint sans l'enregistrer,
Puis, ouvrir le sous dossier sources dans le dossier de téléchargement,
Cliquer sur la dernière photo pour la sélectionner,
Enfoncer la touche F2 pour entrer en mode saisie,
Réaliser le raccourci clavier CTRL + A pour sélectionner le nom avec son extension,
Si les extensions ne sont pas visibles dans votre explorateur, vous devez les afficher avec la case Extensions de noms de fichiers du ruban Affichage.
Revenir sur la base de données Access ,
Double cliquer sur la table archives pour l'ouvrir,
Dans le champ a_titre de la dernière ligne, saisir le texte : La dune du Pilat en Gironde,
Dans le champ a_image , coller le nom du fichier,
Puis, fermer la table,
De retour sur le formulaire, cliquer sur le bouton pour générer le diaporama,
Puis, faire défiler les diapositives jusqu'à la dernière,
Comme vous pouvez l'apprécier, la diapositive pour la dune du Pilat a effectivement été automatiquement greffée à la fin du diaporama.
Le
code VBA Access complet que nous avons construit pour générer automatiquement ce
diaporama évolutif , est le suivant :
Private Sub Parcourir_Click()
Dim base As Database: Dim enr As Recordset
Dim instanceP As Object: Dim diapo As Slide 'Objet diapositive
Dim nomP As String: Dim titreP As String
Dim compteur As Byte
Set base = CurrentDb()
Set enr = base.OpenRecordset("archives")
Set instanceP = CreateObject("PowerPoint.Application")
instanceP.Presentations.Add
compteur = 1
enr.MoveFirst
Do
titreP = enr.Fields("a_titre").Value
nomP = CurrentProject.Path & "\sources\" & enr.Fields("a_image").Value
Set diapo = instanceP.ActivePresentation.Slides.Add(compteur, ppLayoutTitle) 'compteur représente ici la position de la diapositive à insérer pour qu'elles soient placées les unes en dessous des autres
With diapo.Shapes(1)
With .TextFrame.TextRange
.Text = titreP
.Font.Size = 40
.Font.Color.RGB = RGB(81, 81, 81) 'Couleur de texte - Gris foncé
End With
.TextFrame.AutoSize = ppAutoSizeShapeToFitText 'Dimensions ajustées au texte
.Left = 20
.Top = 20
.Fill.BackColor.RGB = RGB(231, 231, 231) 'Couleur fond - blanc cassé
.Line.Weight = 4 'Bordure
.Line.ForeColor.RGB = RGB(81, 81, 81)
End With
diapo.Shapes(2).Delete
diapo.Shapes.AddPicture nomP, False, True, 0, 0, instanceP.ActivePresentation.PageSetup.SlideWidth, instanceP.ActivePresentation.PageSetup.SlideHeight
instanceP.ActivePresentation.Slides(compteur).Shapes("Image4").ZOrder 1
Set diapo = Nothing
compteur = compteur + 1
enr.MoveNext
Loop Until enr.EOF
enr.Close
base.Close
Set enr = Nothing
Set base = Nothing
instanceP.ActivePresentation.SlideShowSettings.Run
End Sub