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.Quitque 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
.Quitdangereux, 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.Quitferme 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 = Falselè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
