🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA PowerPoint dans Excel — créer des diapos, coller des graphiques, sans jamais fermer la présentation de l'utilisateur

|

VBA PowerPoint dans Excel — créer des diapos, coller des graphiques, sans jamais fermer la présentation de l'utilisateur

TL;DR — Vu d'Excel, PowerPoint est un autre programme que vous pilotez par son modèle objet : Application > Presentations > Slides > Shapes. Il n'y a pas de cellules. Une diapositive est une toile de formes placées en points : Excel prépare les chiffres et les graphiques, PowerPoint se contente de les poser. Le piège, c'est que PowerPoint ne tourne qu'en un seul exemplaire : CreateObject("PowerPoint.Application") vous remet le PowerPoint que l'utilisateur a déjà ouvert, avec ses présentations dedans. Ne fermez que la présentation que vous avez créée, et n'appelez .Quit que si PowerPoint ne tournait pas avant le lancement de votre macro. Collez les graphiques comme des images, retentez le collage quand le presse-papiers traîne, et partez d'un modèle au lieu de dessiner les mises en page dans le code.

Sub ChartToNewSlide()
    Dim ppt As Object, pres As Object, sld As Object
    Set ppt = CreateObject("PowerPoint.Application")     ' le PowerPoint deja ouvert, s'il y en a un
    Set pres = ppt.Presentations.Add                      ' une nouvelle presentation, dans une fenetre
    Set sld = pres.Slides.Add(1, 11)                      ' 11 = ppLayoutTitleOnly
    sld.Shapes.Title.TextFrame.TextRange.Text = "Q3 revenue"
    ActiveSheet.ChartObjects(1).Chart.CopyPicture
    sld.Shapes.PasteSpecial DataType:=2                   ' 2 = ppPasteEnhancedMetafile
End Sub

Cet article ouvre une série de trois consacrée au pilotage des autres applications Office depuis Excel. Ici, PowerPoint : une présentation faite de formes. Le guide Word traite du document, qui n'est qu'un long fil de texte. Le guide References traite du lien qui indique à VBA ce que signifient les mots de l'autre programme, et de ce qui se passe quand ce lien manque sur le PC d'un collègue. Une règle traverse les trois : chaque objet appartient à une application, alors dites laquelle.

Ce que vous allez apprendre

  • Le modèle mental : une présentation, ce sont des diapositives couvertes de formes, mesurées en points, sans cellules
  • Pourquoi l'instance unique de PowerPoint rend .Quit dangereux, et comment démarrer et terminer proprement
  • Comment ajouter des diapositives, écrire des titres et utiliser les numéros de mise en page sans référence
  • Comment coller un graphique ou une plage sous forme d'image, et pourquoi le collage échoue parfois
  • Comment placer et dimensionner la forme collée sur la diapositive
  • Pourquoi un modèle de présentation vaut mieux que des mises en page construites dans le code

Le modèle mental : pas de cellules, seulement des formes sur une toile

Excel pense en grille. PowerPoint n'en a pas. Son modèle objet est une chaîne courte :

Objet Ce que c'est Équivalent Excel
Application le programme PowerPoint Application
Presentations / Presentation les présentations ouvertes / une présentation Workbooks / Workbook
Slides / Slide les pages d'une présentation Worksheets / Worksheet
Shapes / Shape tout ce qui est sur une diapositive : titres, zones de texte, images, graphiques (pas de vrai équivalent)

Le texte vit à l'intérieur d'une forme : Shape.TextFrame.TextRange.Text. La position appartient à la forme : .Left, .Top, .Width, .Height, tout en points (72 points par pouce). La diapositive elle-même mesure pres.PageSetup.SlideWidth sur SlideHeight, soit 960 sur 540 points pour une présentation 16:9 standard.

D'où le partage du travail le plus sensé : Excel calcule, PowerPoint place. Construisez le tableau ou le graphique sur une feuille, là où vous avez formules et mise en forme, puis déposez-en une image finie sur la diapositive. Vouloir construire des tableaux cellule par cellule dans PowerPoint est lent et fragile.

Le piège : PowerPoint ne tourne qu'en un seul exemplaire

Excel et Word peuvent tourner en plusieurs exemplaires à la fois. PowerPoint, non. Quand votre macro appelle CreateObject("PowerPoint.Application"), Windows ne démarre pas un PowerPoint neuf et privé, comme le décrit le guide CreateObject pour la plupart des programmes. Il vous donne le PowerPoint déjà en cours, celui qui contient la présentation à moitié terminée de l'utilisateur.

Deux conséquences :

  • ppt.Quit ferme tout. Toutes les présentations ouvertes par l'utilisateur se ferment, et les modifications non enregistrées déclenchent des demandes d'enregistrement, ou sont perdues si votre code les a fait taire.
  • Vous ne pouvez pas le masquer. ppt.Visible = False lève une erreur d'exécution qui se termine par Hiding the application window is not allowed. Si vous devez travailler à l'abri des regards, ouvrez ou ajoutez la présentation sans fenêtre (WithWindow:=0) au lieu de masquer le programme.

Le motif sûr consiste à retenir si PowerPoint tournait déjà, à ne fermer que ce que vous avez ouvert, et à ne quitter que ce que vous avez démarré :

Sub BuildDeck()
    Dim ppt As Object, pres As Object
    Dim wasRunning As Boolean

    On Error Resume Next
    Set ppt = GetObject(, "PowerPoint.Application")   ' tourne-t-il deja ?
    On Error GoTo 0
    wasRunning = Not ppt Is Nothing
    If Not wasRunning Then Set ppt = CreateObject("PowerPoint.Application")

    Set pres = ppt.Presentations.Add
    ' ... ajouter ici diapositives et contenu ...
    pres.SaveAs ThisWorkbook.Path & "\Report.pptx"
    pres.Close                                        ' fermer NOTRE presentation uniquement

    If Not wasRunning Then
        If ppt.Presentations.Count = 0 Then ppt.Quit  ' ne quitter que ce que nous avons demarre
    End If
    Set pres = Nothing
    Set ppt = Nothing
End Sub

GetObject avec un premier argument vide se raccroche à un exemplaire en cours et échoue s'il n'y en a aucun : c'est exactement le test qu'il vous faut. Libérer les variables avec Set ... = Nothing à la fin suit le guide Nothing.

Ajouter des diapositives et du texte sans référence

pres.Slides.Add(Index, Layout) insère une diapositive à une position donnée avec l'une des mises en page intégrées de PowerPoint. Sans référence à la bibliothèque PowerPoint, les noms de mise en page comme ppLayoutTitleOnly ne signifient rien pour le compilateur d'Excel : vous utilisez donc leurs numéros. Déclarez-les une fois pour toutes en constantes, et le code reste lisible :

Const ppLayoutTitle As Long = 1
Const ppLayoutTitleOnly As Long = 11
Const ppLayoutBlank As Long = 12
Const ppPasteEnhancedMetafile As Long = 2
Const ppPastePNG As Long = 6

Sub AddSlides(pres As Object)
    Dim sld As Object
    Set sld = pres.Slides.Add(pres.Slides.Count + 1, ppLayoutTitleOnly)
    sld.Shapes.Title.TextFrame.TextRange.Text = "Sales by region"

    Set sld = pres.Slides.Add(pres.Slides.Count + 1, ppLayoutBlank)
    With sld.Shapes.AddTextbox(1, 40, 40, 600, 50)    ' 1 = texte horizontal
        .TextFrame.TextRange.Text = "Notes for the board"
        .TextFrame.TextRange.Font.Size = 24
    End With
End Sub

pres.Slides.Count + 1 ajoute à la fin. Si vous préférez IntelliSense et les vrais noms, posez une référence à la bibliothèque d'objets PowerPoint ; le guide References l'explique, avec ce que cela coûte quand le fichier voyage.

Coller un graphique ou une plage : en image, puis réessayer

La façon fiable de faire passer du contenu Excel sur une diapositive, c'est l'image. Pour un graphique :

ws.ChartObjects("chtSales").Chart.CopyPicture   ' une image du graphique
Set shp = sld.Shapes.PasteSpecial(DataType:=ppPasteEnhancedMetafile)

Pour une plage, avec sa mise en forme exactement telle qu'elle apparaît sur la feuille :

ws.Range("A1:E12").CopyPicture Appearance:=1, Format:=-4147   ' xlScreen, xlPicture
Set shp = sld.Shapes.PasteSpecial(DataType:=ppPasteEnhancedMetafile)

Un métafichier amélioré reste net quand on redimensionne la diapositive. ppPastePNG donne une image à résolution fixe, identique sur tous les PC. Les deux sont des instantanés : ils ne bougent pas quand le classeur change, ce qui est en général ce qu'on attend d'un rapport.

Vient alors l'échec que tout le monde rencontre. La macro marche neuf fois sur dix, puis s'arrête sur le collage avec une erreur indiquant que le presse-papiers est vide ou contient des données qui ne peuvent pas être collées ici. Le code n'y est pour rien. La copie est encore en train d'être rendue dans le presse-papiers Windows au moment où PowerPoint la réclame. La solution est de lui laisser le temps et de réessayer, pas de semer des Wait fixes partout :

Function PasteWithRetry(sld As Object, ByVal dataType As Long) As Object
    Dim attempt As Long
    For attempt = 1 To 5
        On Error Resume Next
        Set PasteWithRetry = sld.Shapes.PasteSpecial(DataType:=dataType)
        If Err.Number = 0 Then
            On Error GoTo 0
            Exit Function
        End If
        On Error GoTo 0
        DoEvents                                 ' laisser le presse-papiers terminer
        Application.Wait Now + TimeSerial(0, 0, 1)
    Next attempt
    Err.Raise vbObjectError + 513, , "Paste into PowerPoint failed after 5 tries"
End Function

Le guide DoEvents explique pourquoi rendre la main aide ici. Copiez, puis appelez PasteWithRetry, un élément à la fois ; ne copiez jamais cinq graphiques pour ensuite coller cinq fois.

Placer la forme collée

PasteSpecial renvoie la nouvelle forme (sous forme de plage de formes), vous pouvez donc la positionner aussitôt. Partez de la taille de la diapositive, pas de valeurs fixes, pour que le même code fonctionne sur des présentations 4:3 comme 16:9 :

Sub FitToSlide(pres As Object, shp As Object, ByVal topMargin As Single)
    Dim maxW As Single, maxH As Single
    maxW = pres.PageSetup.SlideWidth - 80
    maxH = pres.PageSetup.SlideHeight - topMargin - 40
    shp.LockAspectRatio = -1                       ' msoTrue
    shp.Width = maxW
    If shp.Height > maxH Then shp.Height = maxH    ' les proportions gardent la largeur en phase
    shp.Left = (pres.PageSetup.SlideWidth - shp.Width) / 2
    shp.Top = topMargin
End Sub

Avec les proportions verrouillées, changer la largeur change aussi la hauteur : l'image ne se déforme jamais. Centrer, c'est simplement prendre la largeur de la diapositive moins celle de la forme, divisée par deux.

Le parti pris : remplir un modèle, ne pas dessiner les diapositives dans le code

Chaque pixel que vous positionnez en VBA est un pixel qu'on vous demandera de déplacer le mois prochain. Ma règle : le design de la présentation appartient à un modèle PowerPoint, et la macro se contente de le remplir. Construisez une présentation à la main, avec les bonnes polices, les bonnes couleurs et le logo. Nommez les formes que le code doit remplir dans le Volet Sélection (Selection Pane, Alt+F10), par exemple txtTitle et picChart. La macro ouvre alors une copie et remplit les formes par leur nom :

Set pres = ppt.Presentations.Open(FileName:=ThisWorkbook.Path & "\Monthly.potx", _
                                  ReadOnly:=-1, Untitled:=-1)   ' une copie sans titre
With pres.Slides(1)
    .Shapes("txtTitle").TextFrame.TextRange.Text = "Sales - " & Format(Date, "mmmm yyyy")
    .Shapes("txtTotal").TextFrame.TextRange.Text = Format(ws.Range("F2").Value, "#,##0")
End With

Quand le marketing change les couleurs de la charte, il modifie le modèle, et le code ne bouge pas. La même logique plaide pour coller des images plutôt que des graphiques liés : un lien vers le classeur casse dès que la présentation part par e-mail, et demande au destinataire de mettre à jour des liaisons qu'il ne peut pas atteindre. Si la présentation doit rester vivante, gardez les données dans Excel et relancez la macro. S'il ne vous faut qu'un PDF, le guide Enregistrer en PDF suffit peut-être, sans PowerPoint du tout.

Comment ExcelMaster aide

L'automatisation de PowerPoint échoue d'une manière difficile à voir dans le code : un collage qui rate une exécution sur dix, une macro qui ferme les autres présentations de l'utilisateur, une mise en page qui n'est juste que sur l'écran de son auteur.

ExcelMaster vous laisse décrire la présentation voulue, par exemple « une diapositive par région avec son graphique et le total dans le titre ». Il écrit la macro avec un démarrage et une fin sûrs, colle avec une nouvelle tentative, dimensionne les formes d'après les dimensions de la diapositive, et remplit votre propre modèle au lieu de figer un design dans le code.

Questions fréquentes

Comment ouvrir PowerPoint depuis Excel en VBA ?

Utilisez CreateObject("PowerPoint.Application") puis Presentations.Add pour une nouvelle présentation ou Presentations.Open pour un fichier existant. Comme PowerPoint ne tourne qu'en un seul exemplaire, vérifiez d'abord avec GetObject(, "PowerPoint.Application") s'il tournait déjà, pour savoir si vous avez le droit de le quitter à la fin.

Comment copier un graphique Excel vers PowerPoint en VBA ?

Appelez Chart.CopyPicture sur le graphique, puis Slide.Shapes.PasteSpecial avec DataType:=2 (ppPasteEnhancedMetafile) ou 6 (ppPastePNG). Collez juste après chaque copie et retentez le collage quelques fois avec DoEvents entre deux essais, car le presse-papiers n'est parfois pas prêt.

Pourquoi mon collage VBA dans PowerPoint échoue-t-il au hasard ?

La copie n'a pas fini d'atteindre le presse-papiers Windows quand PowerPoint tente de coller. Retentez le collage dans une courte boucle avec DoEvents et une attente d'une seconde, et collez chaque élément immédiatement après l'avoir copié.

Pourquoi ma macro ferme-t-elle les autres présentations de l'utilisateur ?

PowerPoint est un programme à instance unique : votre macro le partage avec toutes les présentations ouvertes par l'utilisateur, et Application.Quit les ferme toutes. Ne fermez que la présentation créée par votre code, et ne quittez que si PowerPoint ne tournait pas au démarrage de la macro et qu'aucune présentation ne reste ouverte.

Peut-on faire tourner PowerPoint de façon invisible depuis VBA ?

Pas en masquant le programme : passer Visible à False lève une erreur. Ajoutez ou ouvrez plutôt la présentation sans fenêtre, avec WithWindow:=0, et la fenêtre PowerPoint de l'utilisateur reste telle quelle.

Testé dans

Testé dans : Excel 365 et PowerPoint 365 (Windows 11), VBA 7.1 — vérifié le 02/10/2026.

Guides connexes : VBA Word · VBA References · VBA CreateObject · VBA Outlook · VBA Chart · VBA Enregistrer en PDF · VBA DoEvents · VBA Nothing