formateur informatique

Diaporama dynamique à l'ouverture en VBA PowerPoint

Accueil  >  Bureautique  >  Powerpoint  >  Powerpoint VBA  >  Diaporama dynamique à l'ouverture en VBA PowerPoint
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 :


Diaporama au contenu dynamique généré automatiquement

L'objectif de cette formation est de réussir à concevoir un diaporama autonome avec du code Visual Baisic pour PowerPoint. Deux défis sont à relever. Tout d'abord, le code doit se déclencher automatiquement à l'ouverture de la présentation. Ensuite, le diaporama doit générer automatiquement et dynamiquement son contenu, en fonction des photos présentes dans un dossier. Si des photos sont ajoutées, elles doivent être intégrées dans le diaporama, qui évolue donc dynamiquement. Pour que ce code puisse se déclencher à l'ouverture, nous avons besoin de personnaliser le gestionnaire d'événements de PowerPoint. Nous l'avions activé dans la formation précédente, sous forme de complément, afin d'intercepter les événements générés par une présentation, comme son ouverture.

Déclencher un code sur Ouverture de présentation
Pour que le gestionnaire d'événements puisse se déclencher à l'ouverture spécifiquement pour cette présentation, nous devons adapter son code. Et donc, nous devons commencer par créer une nouvelle présentation avec un nom spécifique, qui sera reconnu par le gestionnaire d'événements, dans le code.
  • Démarrer PowerPoint et créer une nouvelle présentation vierge,
  • Si des zones de texte figurent sur la diapositive, les supprimer,
  • Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur de code VBA,
  • Cliquer sur le menu Insertion et choisir Module dans la liste,
Un nouveau module nommé Module1 apparaît dans l'arborescence de l'explorateur de projet, sur la gauche de l'écran. Un module permet d'accueillir les procédures de code Visual Basic. Nous devons commencer par lui attribuer un nom précis à l'aide de la fenêtre Propriétés.
  • Cliquer sur le menu Affichage et choisir Fenêtre Propriétés dans la liste,
La fenêtre Propriétés apparaît conventionnellement en bas à gauche de l'écran, sous l'explorateur de projet. Elle permet de modifier les attributs d'un objet de programmation sélectionné, le module ici en l'occurrence.
  • Dans la fenêtre, modifier la propriété (Name) en Diaporama,
  • Dans sa feuille de code au centre de l'écran, créer la procédure generer(), comme suit :
Sub generer()
MsgBox "Vérification"
End Sub


La fonction MsgBox que nous avons déjà présentée en VBA Excel, permet d'afficher un message à l'écran, celui saisi entre guillemets. Nous allons l'utiliser comme test temporairement afin de vérifier que le gestionnaire d'événements du complément, permet bien d'intercepter l'ouverture de cette présentation spécifiquement.
  • Réaliser le raccourci ALT + F11 pour basculer cette fois sur la présentation PowerPoint,
  • Cliquer sur l'onglet Fichier puis Enregistrer sous et enfin Parcourir,
  • Dans la boîte de dialogue, définir un emplacement de sauvegarde,
  • Dans la zone Type, choisir l'extension pptm pour la gestion du code VBA,
  • Nommer le fichier : diaporama-dynamique par exemple et enregistrer,
Présentation PowerPoint avec gestion du code VBA et macros pptm

Une présentation PowerPoint par défaut (*.pptx) ne permet pas de gérer les macros VBA, pour des raisons de sécurité. C'est pourquoi nous devons le préciser à l'enregistrement pour que le code ne soit pas neutralisé.

Nous devons maintenant récupérer les sources nécessaires à la construction de ce diaporama dynamique. Il s'agit des photos bien sûr mais aussi du complément dont le code doit être adapté. Il s'agit du code qui active le gestionnaire d'événements de PowerPoint, par instanciation d'une classe. Ce code devra ensuite être lié à l'application en tant que complément VBA. Nous l'avons développé dans la formation VBA Powerpoint pour déclencher un événement à l'ouverture.
  • Basculer dans l'éditeur de code (ALT + F11),
  • Dans l'explorateur de projet, déployer le dossier Modules de classe,
  • Double cliquer sur le module gestionEv pour afficher son code dans l'éditeur,
  • En haut de la feuille de code, dans la liste de gauche, choisir l'objet app,
  • Dans la liste de droite, choisir l'événement PresentationOpen,
  • Entre les bornes de la procédure app_PresentationOpen générée, saisir le code suivant :
If (ActivePresentation.Name = "diaporama-dynamique.pptm") Then
Application.Run "diaporama-dynamique.pptm!Diaporama.generer"
End If


L'instruction If permet de poser un critère afin de ne pas déclencher les événements pour chaque présentation de PowerPoint. La formation VBA Excel pour gérer les conditions, présente cette instruction précieuse. Ici nous l'utilisons pour vérifier que la présentation ouverte, porte bien le nom : diaporama-dynamique.pptm. C'est l'objet ActivePresentation associé à sa propriété Name qui permet de valider cette correspondance. Si l'égalité est vérifiée, alors nous lançons le code de la procédure generer, que nous sommes en train de coder dans la présentation diaporama-dynamique.pptm. C'est l'objet Application associé à sa méthode Run qui permet d'exécuter le code d'un module externe, en passant son nom en paramètre, préfixé du nom de la présentation et de celui du module dans lequel il est écrit. Comme ce code est écrit dans la procédure événementielle app_PresentationOpen, il est susceptible de s'exécuter à l'ouverture de la présentation donc.
  • Basculer sur la présentation PowerPoint (ALT + F11),
  • Cliquer sur l'onglet Fichier puis sur Enregistrer sous et Parcourir,
  • Dans la zone Type de la boîte de dialogue, choisir Complément PowerPoint(*.ppam),
  • Puis, cliquer sur Enregistrer et fermer le complément (CTRL + W),
  • Revenir sur la présentation diaporama-dynamique.pptm,
Nous devons lier le complément que nous venons de créer à PowerPoint. Pour ce faire, il est plus simple d'utiliser le ruban Développeur. S'il n'est pas présent dans vos onglets, la formation pour débuter en VBA Excel explique comment l'afficher.
  • Dans le ruban Développeur, cliquer sur le bouton Compléments PowerPoint,
  • Dans la boîte de dialogue qui suit, cliquer sur le bouton Ajouter un nouveau,
  • Sélectionner le complément gestionEv.ppam et valider par Ok pour l'ajouter,
Liaison complément VBA événements et PowerPoint

Le complément dont le but est d'activer le gestionnaire d'événements VBA, spécifiquement pour notre présentation, est désormais lié à l'application PowerPoint. Nous allons vérifier que tout fonctionne correctement.
  • Fermer la présentation diaporama-dynamique.pptm par CTRL + W par exemple,
  • Puis la rouvrir en passant par l'onglet Fichier puis Ouvrir ou Récent,
Le MsgBox s'affiche avec le message de vérification que nous avons codé dans la procédure generer(), elle même lancée par le complément du gestionnaire d'événements. En revanche, si vous ouvrez une autre présentation, qui ne porte pas le même nom, le gestionnaire d'événements reste muet. Tout fonctionne donc parfaitement à ce stade.

Déclarer les variables du diaporama
Pour piloter ce diaporama par le code VBA, nous avons besoin de variables pour gérer la diapositive, les images ou encore les fichiers. Ces variables se déclarent conventionnellement en en-tête de code, pour plus de clarté. La formation VBA Excel sur les variables apprend à déclarer et bien typer ces dernières.
  • Supprimer la ligne de code de la fonction MsgBox de la procédure generer(),
  • Saisir les lignes de déclarations de variables suivantes:
Dim Fichier As String, Dossier As String
Dim Pres As Presentation, Diapositive As Slide
Dim Img As Shape, zone_titre As Shape, effet As Effect
Dim Largeur As Double, Hauteur As Double
Dim nom_zone As String, nom_image As String


Nous avons besoin des variables (Fichier et Dossier) pour parcourir les photos présentes dans le sous dossier sources. Nous déclarons deux variables objets (Presentation et Diapositive) pour piloter le diaporama. Les variables Img et zone_titre, déclarées comme des formes (Shape), permettront de piloter les photos insérées, et leur titre écrit dans une zone de texte. La variable objet effet permettra de définir et paramétrer les effets d'animation à appliquer sur chacune de ces formes. Les variables Largeur et Hauteur seront initialisées sur les dimensions de la diapositive, afin de faciliter le positionnement des formes sur cette dernière. Enfin les variables nom_zone et nom_image permettront d'attribuer des noms explicites aux formes, comme si nous les renommions par le volet Sélection, que nous avons présenté dans la formation PowerPoint sur les outils de dessin.

Poursuivons avec le code de la procédure. Nous allons commencer par initialiser toutes les variables que nous pouvons régler. Nous devons affecter les variables Largeur et Hauteur, respectivement sur la largeur et la hauteur de la diapositive, dans la présentation PowerPoint.
  • A la suite des déclarations, saisir les deux lignes de code suivantes :
Hauteur = ActivePresentation.PageSetup.SlideHeight
Largeur = ActivePresentation.PageSetup.SlideWidth


ActivePresentation est donc l'objet PowerPoint qui désigne la présentation en cours. PageSetup est une propriété qui renvoie une bibliothèque de valeurs sur les réglages de mise en page de la diapositive. Ainsi, les propriétés dérivées SlideHeight et SlideWidth permettent d'atteindre et de renvoyer respectivement, la hauteur et la largeur de cette dernière.

Il est important de contrôler régulièrement le code en cours de conception afin de s'assurer qu'il ne contient pas d'erreur. Sinon, plus on avance, plus elles deviennent compliquées à corriger dans le flot d'informations. Pour ce faire, vous pouvez utiliser le menu Débogage de l'éditeur de code ou encore placer temporairement une fonction MsgBox, pour contrôler les valeurs initialisées.
  • Ajouter la ligne de code suivante à la suite :
Set Diapositive = ActivePresentation.Slides(1)

La propriété Slides de l'objet ActivePresentation renvoie l'objet diapositive, selon l'index passé en paramètre, soit sa position dans la présentation. Comme nous n'avons qu'une seule diapositive, il s'agit forcément de la numéro 1. Nous aurions pu continuer d'utiliser l'expression ActivePresentation.Slides(1) pour la désigner. Mais ainsi reconnue sous le nom Diapositive, les expressions dérivées que nous construirons seront plus courtes et donc plus claires. Comme cette expression renvoie un objet diapositive, dans la déclaration de variable nous avions judicieusement déclaré Diapositive comme un objet Slide. Sinon une erreur aurait été générée.

Nous allons maintenant initialiser les variables qui doivent permettre de parcourir les photos dans le dossier. Pour cela, nous allons faire pointer la variable Dossier dans le sous dossier sources du répertoire de l'application.
  • A la suite du code, ajouter les deux affectations suivantes :
Dossier = ActivePresentation.Path & "\sources\"
Fichier = Dir(Dossier & "\*.jpg*")


La propriété Path de l'objet ActivePresentation retourne le chemin du dossier de l'application. Concaténé (&) au sous dossier \sources\, nous obtenons le chemin complet du dossier dans lequel sont stockées les photos. La fonction Dir avec en paramètre le chemin du répertoire concaténé au filtre, permet de stocker le premier fichier du dossier, dans la variable Fichier. Nous utilisons le filtre *.jpg car il s'agit de l'extension de toutes les photos. A l'avenir, nous pourrons ajouter des fichiers d'une autre nature dans ce dossier, sans que cela nuise à la récupération des photos.

Pour avoir plus de renseignements sur une fonction VBA, un objet, une méthode ou une propriété, sélectionnez cette dernière et enfoncez la touche F1 du clavier. Vous êtes ainsi redirigé sur l'aide en ligne pour l'élément sélectionné.

Maintenant, nous allons appliquer un petit réglage de mise en page avec un thème pour la présentation. Habituellement, nous appliquons ces thèmes par le biais du ruban Création. D'ailleurs la formation PowerPoint sur la lecture en boucle d'un diaporama, nous avait appris à changer de thème d'une diapositive à une autre. Ici, nous appliquons ce thème par le code. Il faut faire référence à un fichier de thème ou de modèle de présentation, enregistré sur le disque, dans les répertoires d'installation des logiciels Office.
  • A la suite du code, ajouter la ligne suivante, en l'adaptant à votre arborescence :
Diapositive.ApplyTheme("C:\ Program Files (x86)\ Microsoft Office\ Document Themes 12\ Technic.thmx")

La méthode ApplyTheme de l'objet Diapositive déclaré et initialisé comme la première diapositive de la présentation, permet d'appliquer un thème, en faisant référence à un fichier de thème, enregistré sur le disque. C'est d'ailleurs ce qu'enseigne l'aide en ligne si vous enfoncez la touche F1 après avoir sélectionné la méthode ApplyTheme dans le code. Ici nous appliquons donc le thème Technic.
Dossier des fichiers de thèmes PowerPoint à appliquer par le code VBA

Nous allons vérifier que cette méthode applique bien le thème.
  • Enfoncer la touche F5 du clavier pour exécuter le code,
  • Basculer sur la présentation (ALT + F11),
Vous remarquez que la diapositive est parée d'un arrière-plan sombre, correspondant au thème Technic. De même, des préférences globales de mise en forme lui sont appliquées. Nous le constaterons, lorsque nous ajouterons des zones de texte. Elles récupèreront les attributs de police définis par le thème.

Chaque exécution du code va récupérer des photos pour les insérer sur la diapositive en leur appliquant des effets d'animation avec minutage. Pour ne pas cumuler ces éléments, le code doit, avant d'insérer ces images, s'assurer que la diapositive est purgée. A l'aide d'une boucle For, nous allons passer en revue, toutes les formes présentes sur la diapositive, pour les supprimer. Ces instructions itératives sont enseignées dans la formation VBA Excel sur les boucles For pour automatiser la mise en forme de tableaux.
  • A la suite de la procédure, ajouter les trois lignes suivantes :
For i = Diapositive.Shapes.Count To 1 Step -1
Diapositive.Shapes(i).Delete
Next i


La propriété Count de la propriété dérivée Shapes de l'objet Diapositive, renvoie le nombre de formes recensées sur la diapositive en cours. Nous initialisons donc une boucle qui part de cette dernière forme, pour remonter jusqu'à la première, en décrémentant de 1 (Step -1). Ainsi, à chaque itération, soit chaque passage dans la boucle, nous supprimons la forme repérée par son numéro d'index, grâce à la méthode Delete (Diapositive.Shapes(i).Delete). Si aucune forme n'est présente, la boucle n'est pas déclenchée puisque la propriété Count renvoie 0.

Parcourir les fichiers d'un dossier en VBA
Il est temps de parcourir le contenu du sous dossier sources afin de récupérer les photos qu'il contient, pour les insérer sur la diapositive. C'est une fois de plus une boucle, qui va permettre ce traitement itératif, mais une boucle Do While cette fois. En effet, avec une boucle For, nous connaissons les points de départ et d'arrivée. L'intérêt d'une boucle Do While (Faire tant que), est qu'elle continue son traitement, tant que le critère qui lui est passé, est vérifié. En effet, on ne connaît pas le nombre de photos dans le dossier, c'est tout l'intérêt de ce diaporama dynamique. Donc elle doit le parcourir et récupérer les images, tant qu'il y en a.
  • A la suite du code, ajouter la boucle Do While pour parcourir les fichiers du dossier :
Do While Len(Fichier) > 0
MsgBox Fichier

Fichier = Dir
Loop


Nous déclenchons la boucle avec comme paramètre d'itération : Len(Fichier) > 0. La fonction Len permet de retourner le nombre de caractères de la variable texte (String) passée en paramètre. Si ce nombre n'est pas supérieur à 0, cela signifie que plus aucun fichier ne correspond au filtre et donc, l'exécution de la boucle se termine. Dans le cas contraire, un traitement est réalisé entre ses bornes. Nous nous contentons pour l'instant de réaliser un test : MsgBox Fichier, pour afficher les noms des photos et contrôler le bon fonctionnement du programme. La ligne Fichier = Dir est essentielle. Elle permet de placer le pointeur sur le fichier suivant dans le dossier, avant de boucler. Sinon, la variable reste toujours calée sur le même nom de fichier, le critère reste toujours vrai et la boucle est infinie. Une instruction Do While se boucle par le mot clé Loop.
  • Enfoncer la touche F5 du clavier pour tester le code,
Récupérer noms fichiers et images dans un dossier en VBA PowerPoint

Un MsgBox apparaît autant de fois qu'il y a de photos correspondant au critère de la boucle, pour afficher le nom du fichier. Le code fonctionne donc parfaitement et récupère bien les éléments du dossier qu'il parcourt.

Insérer des images et des formes en VBA
Maintenant que nous sommes capables de récupérer les noms des images contenues dans le dossier, il s'agit de les insérer sur la diapositive. En même temps, nous devons créer une zone de titre qui affichera le nom du fichier, pour commenter l'image. Puis nous dimensionnerons et positionnerons ces formes par le VBA. Nous devons utiliser les deux noms d'objets que nous avons prévus à cet effet, Img et zone_titre.
  • Supprimer la ligne de la fonction MsgBox dans la boucle,
  • Ajouter les deux lignes de code suivantes, à la place :
Set Img = Diapositive.Shapes.AddPicture(Dossier & "\" & Fichier, False, True, 0, 0)
Set zone_titre = Diapositive.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 200, 50)


Le mot clé Set est nécessairement utilisé pour affecter un objet. L'objet Img et l'objet zone_titre sont affectés respectivement à l'image insérée et à la zone de texte créée. La méthode AddPicture de la propriété Shapes de l'objet Diapositive permet d'insérer l'image désignée en argument (Dossier & "\" & Fichier), selon certains paramètres. Le paramètre suivant (False) indique que l'image est insérée indépendamment du fichier source, non liée. Puis vient la valeur True pour indiquer que l'image doit être sauvegardée avec la présentation. Les deux derniers paramètres permettent d'indiquer l'emplacement de l'image insérée Left et Top. Comme nous définissons ces positions de référence à 0, le coin supérieur gauche de la photo est calé sur le coin supérieur gauche de la diapositive, à l'insertion. Nous pourrions aussi définir la largeur et la hauteur de l'image à l'insertion. Mais comme ces paramètres sont facultatifs, nous ne les indiquons pas et l'image est insérée avec ses dimensions d'origine. La touche F1 sur la méthode sélectionnée, conduit sur l'aide en ligne qui explique comment remplir ses arguments.

La méthode AddTextbox de la propriété Shapes de l'objet Diapositive permet de créer une zone de texte vide (Par défaut), sur la diapositive. Le premier paramètre permet de définir l'orientation du texte, à l'horizontal ici. Les deux paramètres suivants (0,0) indiquant comme précédemment la position de la forme à sa création (Left et Top). Là aussi nous les calons sur le bord supérieur gauche de la diapositive. Les deux derniers paramètres (200,50) permettent de définir respectivement la largeur et la hauteur de la forme à la création (Width et Height). Ces arguments ne sont pas facultatifs, donc nous entrons des valeurs arbitraires que nous changerons par la suite.
  • Enfoncer la touche F5 du clavier pour exécuter le code,
  • Puis, basculer sur la diapositive de la présentation (ALT + F11),
Des images empilées sont présentes sur la diapositive. Il s'agit de toutes les photos du sous dossier, que la boucle a récupérées une à une, grâce à la méthode AddPicture. A chaque passage dans la boucle, la méthode AddTextBox est aussi censée avoir créé une zone de texte. Donc nous devons avoir autant de zones de texte qu'il y a de photos. Elles ne sont pas visibles car pour l'instant elles sont vides. Mais si vous réalisez le raccourci CTRL + A pour tout sélectionner, vous noterez les poignées d'angles de la première zone de texte, en haut à gauche de la diapositive.
Photos insérées sur la diapositive dynamiquement par code VBA PowerPoint

Le volet Sélection est un outil précieux pour manipuler tous les objets présents sur la diapositive, comme nous l'avait appris la formation Powerpoint sur la création de documents promotionnels.
  • Dans le ruban Accueil, cliquer sur le bouton Sélectionner, tout à fait à droite,
  • Dans la liste, choisir Volet Sélection,
Le Volet Sélection, proche de la palette des calques de Photoshop, s'affiche sur la droite de l'espace de travail, comme l'illustre la capture ci-dessus. Il liste tous les éléments de la diapositive et à ce titre, vous notez bien laprésence des images avec autant de zones de texte. Nous allons renommer ces éléments grâce à la propriété Name des objets de type Shape, en VBA PowerPoint.
  • Revenir dans l'éditeur de code (ALT + F11),
  • Dans la boucle, à la suite du code précédent, ajouter les instructions suivantes :
nom_image = Replace(Fichier, ".jpg","")
Img.Name = nom_image
zone_titre.Name = "Titre-" & nom_image


Nous renommons tous ces objets en fonction des noms attribués aux photos dans l'explorateur Windows. La variable Fichier a stocké le nom complet de ce fichier. Donc nous utilisons la fonction Replace de VBA qui permet de remplacer une occurrence par une autre, dans une chaîne de caractères. Ici nous remplaçons l'occurrence .jpg par une chaîne vide. En d'autres termes, nous la supprimons et stockons le résultat final dans la variable nom_image : nom_image = Replace(Fichier, ".jpg", "") . Nous affectons ce résultat à la propriété Name de l'objet Img. Ainsi l'image sur la diapositive possède le même nom que la photo dans l'explorateur, sans l'extension. Nous concaténons ce résultat au texte statique Titre- pour l'affecter à la zone de texte, là encore par sa propriété Name : zone_titre.Name = "Titre-" & nom_image. Chaque zone de texte est ainsi dotée d'un nom proche de la photo qu'elle accompagne. Nous allons de nouveau exécuter le code pour vérifier le résultat. Il n'est pas nécessaire préalablement de supprimer les éléments de la diapositive. L'instruction Diapositive.Shapes(i).Delete dans la boucle For saisie en Amont, se charge de faire le ménage. En son absence en revanche, nous cumulerions les doublons de photos et de zones de texte.
  • Enfoncer la touche F5 du clavier pour exécuter le programme,
  • Basculer sur la présentation (ALT + F11),
Eléments de diapositive renommés par code VBA pour diaporama PowerPoint dynamique

Toutes les images et zones de textes sont bien insérées et créées, puis renommées à la volée cette fois-ci. C'est ce qu'illustre le volet Sélection de la capture ci-dessus.
  • Réaliser le raccourci ALT + F11 pour revenir dans l'éditeur de code,
Maintenant que les objets sont correctement nommés, nous souhaitons les dimensionner et les positionner sur la diapositive, par rapport aux dimensions de cette dernière. Nous avons déjà stocké ces dimensions dans les variables, Hauteur et Largeur, en début de code. Nous souhaitons que la largeur de chaque photo occupe 70% de la largeur de la diapositive. De même, nous souhaitons qu'elle soit centrée sur la largeur de la diapositive et alignée vers le bas, pour laisser de la place au titre.
  • Dans la boucle, à la suite du code précédent, ajouter les instructions suivantes :
Img.Height = Hauteur * 0.7
Img.Top = (Hauteur - Img.Height * 1.1)
Img.Left = (Largeur - Img.Width) / 2


La propriété Height de l'objet Img de type Shape permet d'affecter la hauteur de l'image désignée par cet objet. Nous lui affectons une hauteur égale à 70% de la hauteur de la diapositive (= Hauteur * 0.7). La largeur sera redimensionnée automatiquement afin de conserver les proportions, si bien qu'il n'est pas nécessaire de la définir. La propriété Top de l'objet Img renvoie son emplacement par rapport au bord supérieur de la diapositive. Hauteur - Img.Height : permet de tenir compte de la hauteur de l'image, redimensionnée juste avant, afin de caler son bord inférieur sur le bord inférieur de la diapositive. Avec le facteur 1,1 nous décalons légèrement la photo vers le haut pour laisser respirer la présentation. Enfin, la propriété Left de l'objet Img permet de définir l'emplacement de l'image par rapport au bord gauche de la diapositive. En tenant compte de la moitié de la largeur de la diapositive et de la moitié de la largeur de la photo, nous centrons cette dernière horizontalement sur la présentation ((Largeur - Img.Width) / 2).

Concernant la zone de texte pour le titre de chaque photo, nous souhaitons la placer sur le haut de la diapositive. Nous souhaitons en même temps grossir la taille de la police et centrer le texte dans la zone de saisie.
  • A la suite du code, ajouter les instructions suivantes :
zone_titre.Width = Largeur
zone_titre.Left = 0
zone_titre.TextFrame.TextRange.Text = UCase(Replace(nom_image, "-"," "))
zone_titre.TextFrame.TextRange.ParagraphFormat.Alignment = ppAlignCenter
zone_titre.TextFrame.TextRange.Font.Size = 36
zone_titre.Top = (Img.Top - zone_titre.Height) / 2


La propriété Width de l'objet zone_titre de type Shape permet de définir la largeur de cet objet. Nous lui affectons la largeur de la diapositive. Ainsi lorsque nous centrerons le texte dans la zone de saisie, nous le centrerons en même temps dans la largeur de la diapositive. Avec sa propriété Left, nous calons son bord gauche sur le bord gauche de la diapositive (zone_titre.Left = 0). Pour accéder au texte d'un objet Shape, nous devons utiliser les propriétés dérivées comme suit : zone_titre.TextFrame.TextRange. Alors la propriété finale Text permet de définir le contenu de la zone de saisie.

Grâce à la fonction VBA Replace, nous remplaçons tous les tirets (-) dans le nom de l'image, par un espace (Replace(nom_image, "-", " ")). Puis nous convertissons le résultat en majuscules grâce à la fonction UCase, déjà abordée dans la formation VBA Excel pour modifier la casse des textes dans les cellules. La propriété Alignment permet de régler l'alignement du texte à l'horizontal dans sa zone de saisie (ppAlignCenter). Comme toujours, pour connaître les valeurs qu'il est possible d'affecter à une propriété, pensez à la touche F1 dans l'éditeur de code, sur le terme de la propriété sélectionnée. La propriété Font avec sa propriété Size permet de changer la taille de la police, que nous grossissons ici (Font.Size = 36). D'autres propriétés dérivées de la propriété Font permettent ainsi de régler les attributs de police, comme la couleur par exemple ou le style :

zone_titre.TextFrame.TextRange.Font.Color = RGB(255, 0, 0)
zone_titre.TextFrame.TextRange.Font.Bold = True


Enfin, grâce à sa propriété Top, nous plaçons verticalement la zone de saisie, à la moitié de la hauteur séparant le bord supérieur de la diapositive du bord supérieur de la photo ((Img.Top - zone_titre.Height) / 2).
  • Enfoncer la touche F5 du clavier pour exécuter le code,
  • Basculer sur la présentation (ALT + F11),
Positionnement automatique des formes shape sur la diapositive PowerPoint en VBA

Toutes les images sont en effet correctement retaillées et positionnées si bien qu'elles se chevauchent. De même, toutes les zones de texte sont parfaitement calées au-dessus des photos, centrées sur la largeur de la diapositive.

Effets d'animations en VBA PowerPoint
Toutes les zones de texte sont parfaitement superposées, tout comme les images entre elles. Ce sont les jeux d'animations, à coder en VBA, qui vont permettre de les faire apparaître tour à tour puis disparaître, pour laisser la place aux suivantes. La propriété AnimationSettings d'un objet de type Shape permet de paramétrer les effets d'animation. C'est ce qu'illustre l'exemple ci-dessous :

With Img.AnimationSettings
.EntryEffect = ppEffectFlyFromTop
.AdvanceMode = ppAdvanceOnTime
End With


Ici les propriétés dérivées de la propriété AnimationSettings sur l'objet Img permettent d'attribuer un effet d'apparition depuis le haut de la diapositive, pour chaque photo, ainsi que de régler le démarrage de l'animation, après la précédente. L'inconvénient de cette propriété est qu'elle ne permet pas d'appliquer des effets de disparition. Or chaque photo avec son titre associé, doit disparaître au bout d'un délai à définir, pour laisser apparaître les suivantes, sans chevauchement.

Pour produire de telles animations, notamment de disparition, il faut définir un objet de type Effect grâce à la méthode AddEffect selon la syntaxe suivante :

Set effet = Diapositive.TimeLine.MainSequence.AddEffect(Objet, Effet, événement)

Le premier élément à fournir à la méthode AddEffect est le nom de l'objet à animer. Il s'agira de Img et zone_titre dans notre cas. Le deuxième argument est une constante correspondant à l'effet d'animation à appliquer sur l'objet. Une fois encore, l'aide en ligne de la méthode, grâce à la touche F1, propose les valeurs qu'il est possible d'appliquer pour obtenir les animations souhaitées (Tableau des effets d'animations). Il est possible d'appliquer la valeur textuelle (première colonne) ou numérique (deuxième colonne). Le troisième argument de la méthode AddEffect correspond à l'événement qui ordonne à l'animation de se jouer. La valeur par défaut est msoAnimTriggerOnPageClick, soit au clic de la souris. Là aussi, il est possible d'indiquer une valeur numérique selon les informations du tableau situé à cette adresse.

A chaque passage dans la boucle, nous avons quatre animations à paramétrer. Il faut une animation de type apparaître sur l'image ainsi qu'une animation de type disparaître, moyennant un délai. C'est la même chose pour la zone de texte. Donc, plutôt que de saisir quatre fois le code, nous allons créer une procédure pour gérer les animations. Ce sont les paramètres que nous lui passerons qui définiront l'effet d'animation et l'objet sur lequel il sera appliqué.
  • Après le End Sub de la procédure generer(), créer la procédure animation(), comme suit :
Sub animation (Diapositive As Slide, forme As Shape, direction As Integer, comment As Integer, sortie As Boolean)

End Sub


Nous construisons donc une procédure pour créer et appliquer les effets d'animation. Elle attend cinq paramètres. Selon l'instruction présentée précédemment, il est nécessaire d'indiquer la diapositive à partir de laquelle nous appliquons ces effets. Nous lui passons donc l'objet Diapositive. Il s'agit de connaître l'élément sur lequel l'animation doit être appliquée. Donc nous lui passons l'objet forme déclaré en tant que Shape. Nous souhaitons que la photo apparaisse par le bas et le texte par le haut. Donc nous lui passons la valeur numérique correspondant à la direction qui permettra de personnaliser l'effet d'animation, avec la propriété adéquate. Un effet apparaître doit se produire immédiatement, tandis qu'un effet disparaître doit attendre que les éléments aient été affichés suffisamment longtemps. Donc nous passons l'élément comment qui permettra de définir si l'animation doit se jouer tout de suite ou après, selon une valeur numérique (Integer). Enfin, il s'agit de savoir si l'animation est un effet d'entrée ou de sortie, car les réglages ne sont pas les mêmes. Donc nous passons le dernier argument sortie en tant que Boolean. Si la valeur est vraie, il s'agit d'un effet de sortie, sinon d'un effet d'entrée.
  • Entre les bornes de cette procédure, ajouter les lignes de code suivantes :
Set effet = Diapositive.TimeLine.MainSequence.AddEffect(forme, 2, , comment)
With effet
.EffectParameters.direction = direction
.Timing.Duration = 2

If (sortie = True) Then
.Timing.TriggerDelayTime = 5
.Exit = msoTrue
End If
End With


A l'élément passé en argument (forme), nous appliquons l'effet msoAnimEffectFly, avec la valeur numérique, selon le tableau des effets d'animations. Puis nous indiquons si cette animation doit se jouer avec ou après la précédente avec le paramètre comment de la méthode AddEffect.

Nous listons ensuite les propriétés de l'objet effet ainsi déclaré, afin de le paramétrer selon ces arguments. C'est l'instruction With en VBA qui permet de structurer le code pour énumérer les propriétés d'un objet de programmation. La formation pour débuter la programmation en VBA Excel exploite d'ailleurs amplement cette instruction. La propriété direction de la propriété dérivée EffectParameters de l'objet effet, permet de définir si l'animation vient d'en haut ou dans bas, selon l'argument direction passé en paramètre. Puis nous réglons la durée de l'animation pour la ralentir, grâce à la propriété Duration de la propriété dérivée Timing de l'objet effet.

Enfin l'instruction If qui suit, permet de paramétrer l'animation seulement s'il s'agit d'un effet de sortie, pour faire disparaître l'élément. C'est pourquoi le test est posé sur la variable sortie passée en paramètre (If (sortie = True)). A ce moment-là, nous définissons le délai sur 5 secondes grâce à la propriété TriggerDelayTime de la propriété dérivée Timing de l'objet effet. Ainsi l'élément reste en place assez longtemps avant de disparaître. Enfin et surtout, la propriété Exit de l'objet effet permet de définir qu'il s'agit d'une animation pour disparaitre. L'objet sera ainsi masqué à l'issue pour laisser place aux suivants.

Il s'agit maintenant d'appeler cette procédure quatre fois, depuis la boucle, avec les paramètres adaptés, selon l'élément à animer et l'effet désiré.
  • Dans la boucle de la procédure generer(), à la suite du code précédent, soit avant la ligne Fichier = Dir, ajouter les instructions suivantes :
animation Diapositive, Img, msoAnimDirectionBottom,3, False
animation Diapositive, zone_titre, msoAnimDirectionTop, 2, False
animation Diapositive, Img, msoAnimDirectionBottom, 3, True
animation Diapositive, zone_titre, msoAnimDirectionTop, 2, True


Nous appelons quatre fois la procédure animation pour animer les deux éléments Img et zone_titre avec des effets d'entrée et de sortie. Les images apparaissent par le bas (msoAnimDirectionBottom) après la précédente (3). Les zones de texte apparaissent par le haut (msoAnimDirectionTop) avec la précédente (2), c'est-à-dire en même temps que l'image. Puis viennent les effets de sortie, paramétrés de la même façon mais avec le dernier paramètre réglé à True, pour l'indiquer à la procédure, qui s'en charge en conséquence.
  • Enfoncer la touche F5 du clavier pour générer le code,
  • Basculer sur la présentation avec ALT + F11,
  • Cliquer sur l'onglet Animations pour afficher son ruban,
  • Cliquer sur le bouton Volet Animations,
  • Sélectionner le premier élément du volet et cliquer sur le bouton Lire à partir de,
Tous les effets d'animations programmés par le code VBA sont présents dans le volet, avec leur ordre d'apparition et leur minutage. Le bouton Lire à partir de permet de réaliser un contrôle. Et vous constatez que chaque photo apparaît avec son titre avant de disparaître, après un délai de 5 secondes. Puis surviennent les autres groupes de textes et photos avec les mêmes effets, etc...
Effets animations et minutage automatiques sur photos, codés en VBA PowerPoint

Tous ces effets sont automatisés par le code. De plus, élément très important, le contenu de ce diaporama est dynamique. Chaque nouvelle photo insérée dans le dossier et prise en compte et animée automatiquement.

Il ne reste plus qu'à lancer le diaporama. Cette instruction doit intervenir une fois que tous les éléments ont été placés et que toutes les animations ont été définies. Nous devons donc placer ce code dans la procédure generer(), chronologiquement, soit après la boucle.
  • Après l'instruction Loop de la fermeture de la boucle, saisir l'instruction suivante :
ActivePresentation.SlideShowSettings.Run

La méthode Run de la propriété SlideShowSettings de l'objet ActivePresentation permet de lancer la lecture du diaporama, avec tous les effets d'animation. Pour tester le bon déroulement du programme dans sa globalité, nous allons fermer la présentation puis la rouvrir. Nous devons constater que le gestionnaire d'événements déclenche bien l'exécution du code à l'ouverture, et donc la lecture du diaporama.
  • Basculer sur la diapositive (ALT + F11),
  • Fermer la présentation (CTRL + W),
  • Puis la rouvrir (Fichier/Récent),
Le diaporama se lance effectivement à l'ouverture de la présentation. Chaque photo apparaît avec son titre, puis disparaît au bout de 5 secondes et les suivantes s'enchaînent. Vous pouvez terminer l'exécution du diaporama en enfonçant la touche Echap du clavier.

Nous avons donc constaté que le diaporama en plus de se construire seul, se lançait automatiquement avec l'ouverture de la présentation. Nous devons maintenant vérifier s'il est capable de construire dynamiquement son contenu, en fonction des éléments présents dans le sous dossier sources.
  • Ouvrir l'explorateur Windows (Windows + E),
  • Cliquer sur le sous dossier Images du dossier Bibliothèques sur la gauche de l'explorateur,
  • Sélectionner et copier quelques photos (CTRL + C),
  • Les coller (CTRL + V) dans le sous dossier sources de l'application PowerPoint,
  • Rouvrir la présentation PowerPoint,
Nouvelles photos intégrées dynamiquement dans le diapoarama PowerPoint généré automatiquement en VBA

La lecture du diaporama se lance et, sans avoir fait la moindre modification, son contenu a évolué, intégrant les nouvelles photos, ajoutées à la volée, dans le sous dossier sources.
 
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