La diffusion de présentations Powerpoint passe généralement par une conversion en un fichier PDF pour les rendre inaltérables.
Afin de conserver les liens hypertexte fonctionnels (ce qu’une simple impression au format PDF ne permet pas), il faut exporter la présentation en passant par le menu Fichier, Exporter puis Créer un document PDF/XPS. Cette exportation gagne à être automatisée si elle doit être réalisée régulièrement ou porte sur des plages de vignettes (ou slides) importantes ou disjointes.

Le langage VBA comporte tous les outils nécessaires à cette automatisation. La sélection des vignettes est réalisée à l’aide de la commande .Slides.Range et l’exportation au format PDF avec la commande .ExportAsFixedFormat.
Le code VBA ci-après réalise cette tâche à merveille.
A noter, la ligne Tableau_String = Split(Transforme_Plage(“1-27;29-45;100;105-111; 114-116;118-119;206;300-325; 330;342-346;352-355;359-360;368”), “,”) permet d’indiquer le numéro des vignettes à exporter.
'Macro export Powerpoint vers fichier PDF avec conservation des liens hypertexte
'Export d'une sélection de vignettes Powerpoint en PDF avec conservation des liens hypertexte
'Définition des variables
'---La variable tableau Tableau_String stocke la sélection de vignettes à exporter au format chaîne de caractères (String)
Dim Tableau_String() As String
'---La variable tableau Tableau_Integer stocke la sélection de vignettes à exporter sous forme de nombres entiers (Integer)
Dim Tableau_Integer() As Integer
'---Utilisée pour la boucle compteur (For... To)
'Définition de la sélection des vignettes à exporter en PDF
'---La fonction Split convertit la chaîne de caractères contenant la sélection de vignettes en une variable tableau de type chaîne de caractères
Tableau_String = Split(Transforme_Plage("1-27;29-45;100;105-111;114-116;118-119;206;300-325;330;342-346;352-355;359-360;368"), ",")
'---Redimensionne la variable tableau Tableau_Integer en fonction de la taille de Tableau_String
ReDim Tableau_Integer(UBound(Tableau_String))
'---Boucle de conversion des données String en Integer
For i = LBound(Tableau_String) To UBound(Tableau_String)
Tableau_Integer(i) = CInt(Tableau_String(i))
'Sélection des vignettes (slides) à exporter
' Plus d'infos : https://docs.microsoft.com/fr-fr/office/vba/api/powerpoint.presentation.exportasfixedformat
' Plage définie manuellement (vignettes 1 et 2) : ActivePresentation.Slides.Range(Array(1, 2)).Select
ActivePresentation.Slides.Range(Tableau_Integer()).Select
'Exportation des vignettes sélectionnées vers un fichier PDF
ActivePresentation.ExportAsFixedFormat Path:="C:\Users\COLDIR01\Desktop\DOSSIERS BR\EXPORT POWERPOINT.pdf", _
FixedFormatType:=ppFixedFormatTypePDF, _
Intent:=ppFixedFormatIntentPrint, _
OutputType:=ppPrintOutputSlides, _
RangeType:=ppPrintSelection
Function Transforme_Plage(Plage As String)
'Cette fonction transforme une plage au format "1-3;7" en une liste de vignettes (Array) "1,2,3,7"
Dim Plage_A_Traiter As String 'Plage restant à traiter
Dim Plage_En_Cours As String 'Plage en cours de traitement
Dim Retour As String 'Plage convertie retournée par la fonction
'Recherche le séparateur de plages ;
If InStr(1, Plage_A_Traiter, ";") = 0 Then
'En absence de séparateur de plage
Plage_En_Cours = Plage_A_Traiter
'En présence de séparateur de plages
Plage_En_Cours = Left(Plage_A_Traiter, InStr(1, Plage_A_Traiter, ";") - 1)
Plage_A_Traiter = Right(Plage_A_Traiter, Len(Plage_A_Traiter) - InStr(1, Plage_A_Traiter, ";"))
'Position du séprateur d'extrémité de plage
Pos = InStr(1, Plage_En_Cours, "-")
If Len(Retour) > 0 Then Retour = Retour & ","
Retour = Retour & Plage_En_Cours
For i = Val(Left(Plage_En_Cours, Pos - 1)) To Val(Right(Plage_En_Cours, Len(Plage_En_Cours) - Pos))
If i > Val(Left(Plage_En_Cours, Pos - 1)) And Len(Retour) > 0 Then Retour = Retour & ","
Retour = Retour & Trim(Str(i))
Loop While InStr(1, Plage_A_Traiter, ";") > 0 'Exécuter la boucle tant qu'un séparateur de plages est présent
Transforme_Plage = Retour
'Macro export Powerpoint vers fichier PDF avec conservation des liens hypertexte
'B. RIVIERE, 03/2021
Option Explicit
Sub Export_PDF()
'Export d'une sélection de vignettes Powerpoint en PDF avec conservation des liens hypertexte
'Définition des variables
'---La variable tableau Tableau_String stocke la sélection de vignettes à exporter au format chaîne de caractères (String)
Dim Tableau_String() As String
'---La variable tableau Tableau_Integer stocke la sélection de vignettes à exporter sous forme de nombres entiers (Integer)
Dim Tableau_Integer() As Integer
'---Utilisée pour la boucle compteur (For... To)
Dim i As Integer
'Définition de la sélection des vignettes à exporter en PDF
'---La fonction Split convertit la chaîne de caractères contenant la sélection de vignettes en une variable tableau de type chaîne de caractères
Tableau_String = Split(Transforme_Plage("1-27;29-45;100;105-111;114-116;118-119;206;300-325;330;342-346;352-355;359-360;368"), ",")
'---Redimensionne la variable tableau Tableau_Integer en fonction de la taille de Tableau_String
ReDim Tableau_Integer(UBound(Tableau_String))
'---Boucle de conversion des données String en Integer
For i = LBound(Tableau_String) To UBound(Tableau_String)
Tableau_Integer(i) = CInt(Tableau_String(i))
Next i
'Sélection des vignettes (slides) à exporter
' Plus d'infos : https://docs.microsoft.com/fr-fr/office/vba/api/powerpoint.presentation.exportasfixedformat
' Plage définie manuellement (vignettes 1 et 2) : ActivePresentation.Slides.Range(Array(1, 2)).Select
ActivePresentation.Slides.Range(Tableau_Integer()).Select
'Exportation des vignettes sélectionnées vers un fichier PDF
ActivePresentation.ExportAsFixedFormat Path:="C:\Users\COLDIR01\Desktop\DOSSIERS BR\EXPORT POWERPOINT.pdf", _
FixedFormatType:=ppFixedFormatTypePDF, _
Intent:=ppFixedFormatIntentPrint, _
OutputType:=ppPrintOutputSlides, _
RangeType:=ppPrintSelection
End Sub
Function Transforme_Plage(Plage As String)
'Cette fonction transforme une plage au format "1-3;7" en une liste de vignettes (Array) "1,2,3,7"
Dim Plage_A_Traiter As String 'Plage restant à traiter
Dim Plage_En_Cours As String 'Plage en cours de traitement
Dim Retour As String 'Plage convertie retournée par la fonction
Dim i As Integer
Dim Pos As Integer
Plage_A_Traiter = Plage
Retour = ""
Do
'Recherche le séparateur de plages ;
If InStr(1, Plage_A_Traiter, ";") = 0 Then
'En absence de séparateur de plage
Plage_En_Cours = Plage_A_Traiter
Plage_A_Traiter = ""
Else:
'En présence de séparateur de plages
Plage_En_Cours = Left(Plage_A_Traiter, InStr(1, Plage_A_Traiter, ";") - 1)
Plage_A_Traiter = Right(Plage_A_Traiter, Len(Plage_A_Traiter) - InStr(1, Plage_A_Traiter, ";"))
End If
'Position du séprateur d'extrémité de plage
Pos = InStr(1, Plage_En_Cours, "-")
If Len(Retour) > 0 Then Retour = Retour & ","
Select Case Pos
Case 0:
Retour = Retour & Plage_En_Cours
Case Else
For i = Val(Left(Plage_En_Cours, Pos - 1)) To Val(Right(Plage_En_Cours, Len(Plage_En_Cours) - Pos))
If i > Val(Left(Plage_En_Cours, Pos - 1)) And Len(Retour) > 0 Then Retour = Retour & ","
Retour = Retour & Trim(Str(i))
Next i
End Select
Loop While InStr(1, Plage_A_Traiter, ";") > 0 'Exécuter la boucle tant qu'un séparateur de plages est présent
Transforme_Plage = Retour
End Function
'Macro export Powerpoint vers fichier PDF avec conservation des liens hypertexte
'B. RIVIERE, 03/2021
Option Explicit
Sub Export_PDF()
'Export d'une sélection de vignettes Powerpoint en PDF avec conservation des liens hypertexte
'Définition des variables
'---La variable tableau Tableau_String stocke la sélection de vignettes à exporter au format chaîne de caractères (String)
Dim Tableau_String() As String
'---La variable tableau Tableau_Integer stocke la sélection de vignettes à exporter sous forme de nombres entiers (Integer)
Dim Tableau_Integer() As Integer
'---Utilisée pour la boucle compteur (For... To)
Dim i As Integer
'Définition de la sélection des vignettes à exporter en PDF
'---La fonction Split convertit la chaîne de caractères contenant la sélection de vignettes en une variable tableau de type chaîne de caractères
Tableau_String = Split(Transforme_Plage("1-27;29-45;100;105-111;114-116;118-119;206;300-325;330;342-346;352-355;359-360;368"), ",")
'---Redimensionne la variable tableau Tableau_Integer en fonction de la taille de Tableau_String
ReDim Tableau_Integer(UBound(Tableau_String))
'---Boucle de conversion des données String en Integer
For i = LBound(Tableau_String) To UBound(Tableau_String)
Tableau_Integer(i) = CInt(Tableau_String(i))
Next i
'Sélection des vignettes (slides) à exporter
' Plus d'infos : https://docs.microsoft.com/fr-fr/office/vba/api/powerpoint.presentation.exportasfixedformat
' Plage définie manuellement (vignettes 1 et 2) : ActivePresentation.Slides.Range(Array(1, 2)).Select
ActivePresentation.Slides.Range(Tableau_Integer()).Select
'Exportation des vignettes sélectionnées vers un fichier PDF
ActivePresentation.ExportAsFixedFormat Path:="C:\Users\COLDIR01\Desktop\DOSSIERS BR\EXPORT POWERPOINT.pdf", _
FixedFormatType:=ppFixedFormatTypePDF, _
Intent:=ppFixedFormatIntentPrint, _
OutputType:=ppPrintOutputSlides, _
RangeType:=ppPrintSelection
End Sub
Function Transforme_Plage(Plage As String)
'Cette fonction transforme une plage au format "1-3;7" en une liste de vignettes (Array) "1,2,3,7"
Dim Plage_A_Traiter As String 'Plage restant à traiter
Dim Plage_En_Cours As String 'Plage en cours de traitement
Dim Retour As String 'Plage convertie retournée par la fonction
Dim i As Integer
Dim Pos As Integer
Plage_A_Traiter = Plage
Retour = ""
Do
'Recherche le séparateur de plages ;
If InStr(1, Plage_A_Traiter, ";") = 0 Then
'En absence de séparateur de plage
Plage_En_Cours = Plage_A_Traiter
Plage_A_Traiter = ""
Else:
'En présence de séparateur de plages
Plage_En_Cours = Left(Plage_A_Traiter, InStr(1, Plage_A_Traiter, ";") - 1)
Plage_A_Traiter = Right(Plage_A_Traiter, Len(Plage_A_Traiter) - InStr(1, Plage_A_Traiter, ";"))
End If
'Position du séprateur d'extrémité de plage
Pos = InStr(1, Plage_En_Cours, "-")
If Len(Retour) > 0 Then Retour = Retour & ","
Select Case Pos
Case 0:
Retour = Retour & Plage_En_Cours
Case Else
For i = Val(Left(Plage_En_Cours, Pos - 1)) To Val(Right(Plage_En_Cours, Len(Plage_En_Cours) - Pos))
If i > Val(Left(Plage_En_Cours, Pos - 1)) And Len(Retour) > 0 Then Retour = Retour & ","
Retour = Retour & Trim(Str(i))
Next i
End Select
Loop While InStr(1, Plage_A_Traiter, ";") > 0 'Exécuter la boucle tant qu'un séparateur de plages est présent
Transforme_Plage = Retour
End Function
___
Pour aller plus loin : manipulation de chaînes de caractères / fonction Split et variables tableau / programmer en VBA
The following two tabs change content below.