Pour répondre à la demande d'un utilisateur du forum answers.microsoft.com, j'ai développé des outils afin d'appliquer des étiquettes aux diapositives pour pouvoir facilement sélectionner celles à projeter.
Pour cela je vous propose d'utiliser 3 macros :
- La 1ère permet d'ajouter des étiquettes aux diapositives d'une présentation en se basant sur un tableau Excel.
- La 2ème permet de supprimer toutes les étiquettes associées aux diapositives.
- La 3ème permettant de générer des diaporamas personnalisés (ruban Diaporama) correspondant à une "requête" basée sur ces étiquettes.
Macro 1 : Génération des étiquettes des diapositives
> Préparer un tableau Excel recensant les étiquettes et les valeurs pour chaque diapositive.
À partir de Powerpoint, exécuter le code suivant pour ajouter ces étiquettes et leur valeur à toutes les diapositives mentionnées dans la présentation active.
Si certaines étiquettes sont déjà présentes, leurs valeurs seront mise à jour.
Sub AjouterTagsAuxDiapos()
' Objectif : Appliquer des étiquettes aux diapositives d'une présentation en se basant sur les
' données d'un tableau Excel.
' Remarque : Si l'étiquette est déjà présente, sa valeur sera mise à jour.
' Utilisation : > Générer un tableau Excel présentant en 1ere colonne les N° des diapositives,
' chaque colonnesuivante représentant l'intitulé de l'étiquette en ligne 1
' (exemple : Pays) puis les valeurs correspondantes au N° de diapositive. Cette
' plage devant être nommé "Tags" (sélectionner la plage puis Formules>Définir un nom).
' > Lancer la macro à partir de Powerpoint.
' Retour : Néant
' Auteur : Arnaud (www.1forme.fr).
' Licence : CC-BY-NC-SA (Vous pouvez diffuser/partager/modifier cette macro dans les même
' conditions, seulement à titre personnel et citant l'auteur/site d'origine.
Dim objExcelApp As Object
Dim objWb As Object
Dim objRng As Object
Dim objCell As Object
Dim objDialog As FileDialog
Dim strFilePath As String
Dim lngSlideIndex As Long
Dim i As Integer
Dim strTagName As String
Dim strTagValue As String
Dim objSlide As slide
' Ouvrir la fenêtre de sélection de fichier
Set objDialog = Application.FileDialog(msoFileDialogFilePicker)
objDialog.Filters.Add "Fichiers Excel", "*.xls; *.xlsx", 1
objDialog.AllowMultiSelect = False
objDialog.Title = "Sélectionner le fichier Excel contenant la plage 'Tags' à utiliser"
If objDialog.Show = -1 Then ' Si l'utilisateur sélectionne un fichier
strFilePath = objDialog.SelectedItems(1)
Else
MsgBox "Aucun fichier sélectionné.", vbExclamation
Exit Sub
End If
' Lancer Excel et ouvrir le fichier sélectionné
On Error Resume Next
Set objExcelApp = CreateObject("Excel.Application")
On Error GoTo 0
If objExcelApp Is Nothing Then
MsgBox "Excel n'a pas pu être lancé.", vbExclamation
Exit Sub
End If
Set objWb = objExcelApp.Workbooks.Open(strFilePath)
' Vérifier si la plage nommée "Tags" existe
On Error Resume Next
Set objRng = objWb.names("Tags").RefersToRange
On Error GoTo 0
If objRng Is Nothing Then
MsgBox "La plage nommée 'Tags' n'existe pas dans le fichier sélectionné.", vbExclamation
objWb.Close False
objExcelApp.Quit
Exit Sub
End If
' Parcourir les lignes de la plage "Tags"
For Each objCell In objRng.Columns(1).Cells ' La première colonne contient les numéros de diapositive
If IsNumeric(objCell.Value) Then
lngSlideIndex = CLng(objCell.Value)
On Error GoTo erreur ' Pas d'erreur si la diapositive n'existe pas
Set objSlide = ActivePresentation.Slides(lngSlideIndex)
On Error GoTo 0
If Not objSlide Is Nothing Then
' Parcourir les colonnes pour ajouter les tags
For i = 2 To objRng.Columns.Count
strTagName = objRng.Cells(1, i).Value ' Étiquette de colonne comme nom de tag
strTagValue = objRng.Cells(objCell.Row, i).Value ' Valeur du tag
If Not IsEmpty(strTagName) And Not (strTagValue = "") Then
objSlide.Tags.Add strTagName, strTagValue
End If
Next i
End If
End If
Next objCell
' Fermer le classeur et quitter Excel
objWb.Close False
Set objWb = Nothing
objExcelApp.Quit
Set objExcelApp = Nothing
MsgBox "Les tags ont été ajoutés avec succès.", vbInformation
Exit Sub
erreur:
' Diapositive non existante
Set objSlide = Nothing
Resume Next
End Sub
Macro 2 : Effacement des étiquettes des diapositives
À utiliser si l'on veut annuler/supprimer toutes les étiquettes des diapositives de la présentation active.
Sub SupprimerTousLesTags()
' Objectif : Supprimer toutes les étiquettes de toutes les diapositives de la présentation.
' Utilisation : Lancer la macro à partir de Powerpoint.
' Retour : Néant
' Auteur : Arnaud (www.1forme.fr).
' Licence : CC-BY-NC-SA (Vous pouvez diffuser/partager/modifier cette macro dans les même
' conditions, seulement à titre personnel et citant l'auteur/site d'origine.
Dim objSlide As slide
Dim i As Integer
' Parcourir toutes les diapositives de la présentation active
For Each objSlide In ActivePresentation.Slides
' Supprimer tous les tags de la diapositive en cours
For i = objSlide.Tags.Count To 1 Step -1
objSlide.Tags.Delete objSlide.Tags.Name(i)
Next i
Next
MsgBox "Tous les tags ont été supprimés de toutes les diapositives.", vbInformation
End Sub
Macro 3 : Génération du diaporama personnalisé à partir des étiquettes
Il faudra fournir une chaîne de texte représentant le nom du diaporama personnalisé suivit du caractère ':' puis la chaine indiquant quelles étiquettes sont à prendre en compte pour sélectionner les diapositives devant être ajoutées au diaporama personnalisé.
- Le nom du diaporama personnalisé n'a pas de contrainte précise (espaces, chiffres...). Si ce diaporama personnalisé existe déjà dans cette présentation, l'exécution du code s'arrêtera et le diaporama personnalisé ne sera pas créé.
- La chaîne de "requête" peut contenir les opérateurs suivants : =, >, >=, <, <=, <>, et, ou, +, -, *, /.
- Utiliser des parenthèses pour gérer l'ordre de priorité d'évaluation de la chaîne de requête.
Exemple :- ((Pays="Fr") ou (Pays="Gb")) et (Valeur>=(50+20))
Pour sélectionner les diapositives dont l'étiquette Pays est 'Fr' ou 'Gb' mais dont l'étiquette Valeur est supérieur ou égale à 70.
- ((Pays="Fr") ou (Pays="Gb")) et (Valeur>=(50+20))
Sub CreerDiaporamaPersoBaseSurTags()
' Objectif : Générer un diaporama personnalisé sélectionnant les diapositives ayant certaines
' étiquettes et ce via une "requête".
' Utilisation : > Lancer la macro à partir de Powerpoint.
' > Saisir le nom du diaporama personnalisé puis le caractère ':' et enfin la chaine
' correspondante à la "requête".
' Exemple : ((Pays="Fr") ou (Pays="Gb")) et (Valeur>=(50+20)) pour sélectionner les
' diapositives dont l'étiquette Pays est 'Fr' ou 'Gb' mais dont l'étiquette
' Valeur est supérieur ou égale à 70.
' Retour : Un nouveau diaporamas personnalisés.
' Auteur : Arnaud (www.1forme.fr).
' Licence : CC-BY-NC-SA (Vous pouvez diffuser/partager/modifier cette macro dans les même
' conditions, seulement à titre personnel et citant l'auteur/site d'origine.
Dim strUserInput As String
Dim strDiapoName As String
Dim strCriteria As String
Dim objSlide As slide
Dim tabSlides() As Long
Dim intSlideIndex As Integer
Dim varModCriteria As Variant
Dim bolExist As Boolean
Dim i As Integer
Dim objPersonDiap As NamedSlideShow
Dim objExcelApp As Object
' Demander à l'utilisateur de saisir la chaîne de texte
strUserInput = InputBox("Saisir le nom du diaporama personnalisé à créer et " & vbCrLf & _
"la chaîne de critères de sélection des diapositives " & vbCrLf & _
"à utiliser séparé par le caractère ':'." & vbCrLf & vbCrLf & _
"Exemple de saisie >>>" & vbCrLf & _
"FranceSup2:(Pays=""Fr"") et (Valeur>2)", "Création de diaporama personnalisé")
' Vérifier si l'utilisateur a bien saisi une chaîne avec ":"
If InStr(strUserInput, ":") = 0 Then
MsgBox "Le format de la chaîne est incorrect. Assurez-vous qu'il contient ':' pour " & _
"séparer le nom et la chaîne de critères.", vbExclamation, "Commande incorrecte !"
Exit Sub
End If
' Séparer le nom du diaporama et les critères
strDiapoName = Trim(Left(strUserInput, InStr(strUserInput, ":") - 1))
If strDiapoName = "" Then
MsgBox "Le format de la chaîne est incorrect. Assurez-vous qu'il contient " & _
"bien un texte à gauche du caractère ':' représentant le nom du " & _
"nouveau diaporama personnalisé.", vbExclamation, "Pas de nom !"
Exit Sub
End If
' Vérifier si le diaporama personnalisé existe déjà
bolExist = False
For Each objPersonDiap In ActivePresentation.SlideShowSettings.NamedSlideShows
If objPersonDiap.Name = strDiapoName Then
bolExist = True
Exit For
End If
Next
If bolExist Then
MsgBox "Diaporama personnalisé est déja existant"
Exit Sub
End If
strCriteria = Trim(Mid(strUserInput, InStr(strUserInput, ":") + 1))
If strCriteria = "" Then
MsgBox "Le format de la chaîne est incorrect. Assurez-vous qu'il contient " & _
"bien un texte à droite du caractère ':' représentant les critères " & _
"de sélection des diapositives", vbExclamation, "Pas de critères de sélection !"
Exit Sub
End If
' Remplacer les "Ou" et "Et"
strCriteria = Replace(strCriteria, " Ou ", " + ", , , vbTextCompare)
strCriteria = Replace(strCriteria, " Et ", " * ", , , vbTextCompare)
' Initialiser le tableau des diapositives à sélectionner
ReDim tabSlides(1 To ActivePresentation.Slides.Count)
On Error Resume Next
Set objExcelApp = CreateObject("Excel.Application")
On Error GoTo 0
' Parcourir les diapositives et vérifier les critères
For Each objSlide In ActivePresentation.Slides
varModCriteria = strCriteria
' Remplacer chaque tag par sa valeur pour cette diapositive
For i = 1 To objSlide.Tags.Count
ValTag = objSlide.Tags.Value(i)
If IsNumeric(ValTag) Then
varModCriteria = Replace(UCase(varModCriteria), UCase(objSlide.Tags.Name(i)), CLng(ValTag))
Else
varModCriteria = Replace(UCase(varModCriteria), UCase(objSlide.Tags.Name(i)), """" & UCase(ValTag) & """")
End If
Next i
' Évaluer l'expression Pays="Fr" et Valeur>2
On Error Resume Next
If UCase(varModCriteria) <> UCase(strCriteria) Then
If objExcelApp.Evaluate(varModCriteria) Then
intSlideIndex = intSlideIndex + 1
tabSlides(intSlideIndex) = objSlide.slideID
End If
End If
On Error GoTo 0
Next objSlide
Set objExcelApp = Nothing
' Mettre à jour la liste des diapositives du diaporama personnalisé
If intSlideIndex > 0 Then
' Redimensionner le tableau pour correspondre au nombre réel de diapositives sélectionnées
ReDim Preserve tabSlides(1 To intSlideIndex)
' Créer un nouveau diaporama personnalisé vide
ActivePresentation.SlideShowSettings.NamedSlideShows.Add strDiapoName, tabSlides
MsgBox "Le diaporama personnalisé '" & strDiapoName & "' a été créé avec succès.", vbInformation
Else
MsgBox "Aucune diapositive ne correspond aux critères spécifiés.", vbExclamation
End If
End Sub
Merci pour votre attention bienveillante.