formateur informatique

Créer un diaporama PowerPoint en VBA Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Créer un diaporama PowerPoint en VBA Access
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 :


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.

Données de table Access pour créer un diaporama PowerPoint de photos en VBA

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.

Bouton de formulaire Access pour générer automatiquement un diaporama PowerPoint

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.

Images pour générer diaporama PowerPoint depuis formulaire VBA Access

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,
Ajouter la référence à PowerPoint dans le projet VBA Access

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,
Diaporama PowerPoint dynamique et évolutif en fonction des données de table Access

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


 
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