Powerpoint : automatiser l’exportation d’une sélection de vignettes en PDF avec conservation des liens hypertexte

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.

Powerpoint liens hypertexte

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
'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

Share Button
The following two tabs change content below.
Benoît RIVIERE
Après seize années passées en cabinet d’expertise-comptable et de commissariat aux comptes (où j’ai exercé comme expert-comptable et chef de mission audit), j’ai pris le poste de directeur comptable d’un groupe de distribution automobile en novembre 2014. Au cours de ma carrière, j’ai acquis une expérience significative en audit et en exploitation des systèmes d’information (analyse de données, automatisation des tâches, programmation informatique) au service de la production des comptes annuels et consolidés. C’est cette expérience personnelle et ma passion pour l’informatique que je partage sur ce blog. Mon CV / Réalisations personnelles et projets informatiques / Ma collection / Me contacter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.