TL;DR — Aus Sicht von Excel ist PowerPoint ein anderes Programm, das Sie über sein Objektmodell steuern:
Application > Presentations > Slides > Shapes. Zellen gibt es dort nicht. Eine Folie ist eine Fläche mit Formen, die in Punkt positioniert werden — Excel bereitet also Zahlen und Diagramme vor, PowerPoint platziert sie nur. Die Falle: PowerPoint läuft nur als eine einzige Instanz.CreateObject("PowerPoint.Application")liefert Ihnen das PowerPoint, das der Nutzer bereits geöffnet hat, samt seiner Präsentationen. Schließen Sie nur die Präsentation, die Sie selbst angelegt haben, und rufen Sie.Quitnur auf, wenn PowerPoint vor dem Start Ihres Makros nicht lief. Fügen Sie Diagramme als Grafik ein, wiederholen Sie das Einfügen, wenn die Zwischenablage hinterherhinkt, und bauen Sie auf einer Vorlage auf, statt Layouts im Code zu zeichnen.
Sub ChartToNewSlide()
Dim ppt As Object, pres As Object, sld As Object
Set ppt = CreateObject("PowerPoint.Application") ' das laufende PowerPoint, falls vorhanden
Set pres = ppt.Presentations.Add ' eine neue Praesentation, mit Fenster
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
Dies ist der erste Teil einer dreiteiligen Reihe darüber, andere Office-Programme aus Excel zu steuern. Hier geht es um PowerPoint: eine Präsentation aus Formen. Die Word-Anleitung behandelt ein Dokument, also einen langen Textfluss. Die Anleitung zu Verweisen erklärt die Verbindung, über die VBA das Vokabular des anderen Programms kennt — und was passiert, wenn diese Verbindung auf dem PC eines Kollegen fehlt. Durch alle drei Teile zieht sich eine Regel: Jedes Objekt gehört zu genau einer Anwendung — sagen Sie also, zu welcher.
Was Sie lernen
- Das mentale Modell: Eine Präsentation besteht aus Folien mit Formen, gemessen in Punkt, ohne Zellen
- Warum die Einzelinstanz von PowerPoint
.Quitgefährlich macht, und wie Sie sicher starten und beenden - Wie Sie ohne Verweis Folien hinzufügen, Titel schreiben und Layoutnummern verwenden
- Wie Sie ein Diagramm oder einen Bereich als Grafik einfügen, und warum das Einfügen manchmal scheitert
- Wie Sie eine eingefügte Form auf der Folie platzieren und skalieren
- Warum eine Vorlage besser ist, als Layouts im Code zu bauen
Das mentale Modell: keine Zellen, nur Formen auf einer Fläche
Excel denkt in einem Raster. PowerPoint hat keines. Sein Objektmodell ist eine kurze Kette:
| Objekt | Was es ist | Gegenstück in Excel |
|---|---|---|
Application |
das Programm PowerPoint | Application |
Presentations / Presentation |
geöffnete Präsentationen / eine Präsentation | Workbooks / Workbook |
Slides / Slide |
die Folien einer Präsentation | Worksheets / Worksheet |
Shapes / Shape |
alles auf einer Folie: Titel, Textfelder, Grafiken, Diagramme | (kein echtes Gegenstück) |
Text steckt in einer Form: Shape.TextFrame.TextRange.Text. Die Position gehört zur Form: .Left, .Top,
.Width, .Height, alles in Punkt (72 Punkt pro Zoll). Die Folie selbst misst
pres.PageSetup.SlideWidth mal SlideHeight, bei einer üblichen 16:9-Präsentation 960 mal 540 Punkt.
Daraus folgt die sinnvolle Arbeitsteilung: Excel rechnet, PowerPoint platziert. Bauen Sie Tabelle oder Diagramm auf einem Tabellenblatt, wo Sie Formeln und Formatierung zur Hand haben, und bringen Sie dann eine fertige Grafik davon auf die Folie. Tabellen Zelle für Zelle in PowerPoint zusammenzusetzen ist langsam und fehleranfällig.
Die Falle: PowerPoint läuft nur ein einziges Mal
Excel und Word lassen sich mehrfach parallel starten. PowerPoint nicht. Wenn Ihr Makro
CreateObject("PowerPoint.Application") aufruft, startet Windows kein frisches, privates PowerPoint, wie es
die CreateObject-Anleitung für die meisten Programme beschreibt. Sie bekommen das
PowerPoint, das bereits läuft — genau das, in dem die halbfertige Präsentation des Nutzers liegt.
Daraus ergeben sich zwei Dinge:
ppt.Quitschließt alles. Jede Präsentation, die der Nutzer geöffnet hat, wird geschlossen; ungespeicherte Änderungen lösen Speichern-Abfragen aus oder gehen verloren, wenn Ihr Code diese Abfragen unterdrückt.- Sie können es nicht ausblenden.
ppt.Visible = Falselöst einen Laufzeitfehler aus, der mit Hiding the application window is not allowed endet (sinngemäß: Das Ausblenden des Anwendungsfensters ist nicht zulässig). Wenn Sie unsichtbar arbeiten müssen, öffnen oder erstellen Sie die Präsentation ohne Fenster (WithWindow:=0), statt das Programm zu verstecken.
Das sichere Muster: Merken Sie sich, ob PowerPoint schon lief, schließen Sie nur, was Sie geöffnet haben, und beenden Sie nur, was Sie gestartet haben:
Sub BuildDeck()
Dim ppt As Object, pres As Object
Dim wasRunning As Boolean
On Error Resume Next
Set ppt = GetObject(, "PowerPoint.Application") ' laeuft es bereits?
On Error GoTo 0
wasRunning = Not ppt Is Nothing
If Not wasRunning Then Set ppt = CreateObject("PowerPoint.Application")
Set pres = ppt.Presentations.Add
' ... hier Folien und Inhalte hinzufuegen ...
pres.SaveAs ThisWorkbook.Path & "\Report.pptx"
pres.Close ' nur UNSERE Praesentation schliessen
If Not wasRunning Then
If ppt.Presentations.Count = 0 Then ppt.Quit ' nur beenden, was wir gestartet haben
End If
Set pres = Nothing
Set ppt = Nothing
End Sub
GetObject mit leerem erstem Argument hängt sich an eine laufende Instanz und schlägt fehl, wenn es keine
gibt — genau der Test, den Sie brauchen. Die Variablen am Ende mit Set ... = Nothing freizugeben, folgt der
Nothing-Anleitung.
Folien und Text ohne Verweis hinzufügen
pres.Slides.Add(Index, Layout) fügt an einer Position eine Folie mit einem der integrierten Layouts von
PowerPoint ein. Ohne Verweis auf die PowerPoint-Bibliothek sagen Layoutnamen wie ppLayoutTitleOnly dem
Excel-Compiler nichts, also verwenden Sie ihre Zahlen. Deklarieren Sie sie einmal als Konstanten, dann bleibt
der Code lesbar:
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 = horizontaler Text
.TextFrame.TextRange.Text = "Notes for the board"
.TextFrame.TextRange.Font.Size = 24
End With
End Sub
pres.Slides.Count + 1 hängt die Folie am Ende an. Wenn Sie lieber IntelliSense und die echten Namen hätten,
setzen Sie einen Verweis auf die PowerPoint-Objektbibliothek; die
Anleitung zu Verweisen erklärt das — und was dieser Verweis kostet, sobald die Datei
weitergegeben wird.
Diagramm oder Bereich einfügen: als Grafik, dann erneut versuchen
Der zuverlässige Weg, Excel-Inhalte auf eine Folie zu bringen, ist eine Grafik. Ein Diagramm:
ws.ChartObjects("chtSales").Chart.CopyPicture ' eine Grafik des Diagramms
Set shp = sld.Shapes.PasteSpecial(DataType:=ppPasteEnhancedMetafile)
Ein Bereich, mit genau der Formatierung, die er auf dem Blatt hat:
ws.Range("A1:E12").CopyPicture Appearance:=1, Format:=-4147 ' xlScreen, xlPicture
Set shp = sld.Shapes.PasteSpecial(DataType:=ppPasteEnhancedMetafile)
Eine erweiterte Metadatei (Enhanced Metafile) bleibt scharf, wenn die Folie skaliert wird. ppPastePNG
liefert ein Bild mit fester Auflösung, das auf jedem PC gleich aussieht. Beides sind Momentaufnahmen: Sie
ändern sich nicht mit der Arbeitsmappe — und genau das will ein Bericht meistens.
Jetzt der Fehler, auf den jeder stößt. Das Makro läuft neunmal von zehn, dann bleibt es beim Einfügen stehen, mit der Meldung, die Zwischenablage sei leer oder enthalte Daten, die hier nicht eingefügt werden können. Am Code ist nichts falsch. Die Kopie wird noch in die Windows-Zwischenablage gerendert, während PowerPoint sie schon anfordert. Die Lösung ist, ihr Zeit zu geben und es erneut zu versuchen — nicht, überall ein festes Wait einzustreuen:
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 ' Zwischenablage fertig werden lassen
Application.Wait Now + TimeSerial(0, 0, 1)
Next attempt
Err.Raise vbObjectError + 513, , "Paste into PowerPoint failed after 5 tries"
End Function
Die DoEvents-Anleitung erklärt, warum das Abgeben der Kontrolle hier hilft. Kopieren
Sie, rufen Sie dann PasteWithRetry auf, ein Element nach dem anderen; kopieren Sie nie fünf Diagramme auf
einmal, um danach fünfmal einzufügen.
Die eingefügte Form platzieren
PasteSpecial gibt die neue Form zurück (als ShapeRange), Sie können sie also sofort positionieren. Rechnen
Sie mit der Foliengröße statt mit festen Zahlen, dann funktioniert derselbe Code für 4:3- und
16:9-Präsentationen:
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 ' Seitenverhaeltnis zieht die Breite mit
shp.Left = (pres.PageSetup.SlideWidth - shp.Width) / 2
shp.Top = topMargin
End Sub
Bei gesperrtem Seitenverhältnis ändert eine neue Breite auch die Höhe, die Grafik wird also nie verzerrt. Zum Zentrieren ziehen Sie die Formbreite von der Folienbreite ab und halbieren das Ergebnis.
Die Abwägung: Vorlage befüllen, keine Folien im Code zeichnen
Jedes Pixel, das Sie in VBA positionieren, ist ein Pixel, das jemand nächsten Monat verschoben haben will.
Meine Regel: Das Design der Präsentation gehört in eine PowerPoint-Vorlage, das Makro befüllt sie nur.
Bauen Sie eine Präsentation von Hand, mit den richtigen Schriften, Farben und dem Logo. Benennen Sie die
Formen, die der Code befüllen soll, im Auswahlbereich (Selection Pane, Alt+F10), zum Beispiel txtTitle und
picChart. Dann öffnet das Makro eine Kopie und befüllt die Formen über ihren Namen:
Set pres = ppt.Presentations.Open(FileName:=ThisWorkbook.Path & "\Monthly.potx", _
ReadOnly:=-1, Untitled:=-1) ' eine unbenannte Kopie
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
Ändert das Marketing die Markenfarben, bearbeitet es die Vorlage, und der Code bleibt, wie er ist. Dieselbe Logik spricht dafür, Grafiken statt verknüpfter Diagramme einzufügen: Eine Verknüpfung zur Arbeitsmappe bricht, sobald die Präsentation per E-Mail verschickt wird, und fordert den Empfänger auf, Verknüpfungen zu aktualisieren, die er gar nicht erreichen kann. Muss die Präsentation aktuell bleiben, lassen Sie die Daten in Excel und führen das Makro erneut aus. Brauchen Sie nur ein PDF, reicht vielleicht schon die Anleitung zum Speichern als PDF — ganz ohne PowerPoint.
Wie ExcelMaster hilft
PowerPoint-Automatisierung scheitert auf eine Weise, die man dem Code kaum ansieht: ein Einfügen, das bei jedem zehnten Lauf fehlschlägt, ein Makro, das die anderen Präsentationen des Nutzers schließt, ein Layout, das nur auf dem Bildschirm des Autors stimmt.
Mit ExcelMaster beschreiben Sie die Präsentation, die Sie haben wollen, etwa „eine Folie pro Region mit ihrem Diagramm und der Summe im Titel“. ExcelMaster schreibt das Makro mit sicherem Start und Ende, fügt mit Wiederholung ein, skaliert Formen anhand der Foliengröße und befüllt Ihre eigene Vorlage, statt ein Design fest einzucodieren.
Häufig gestellte Fragen
Wie öffne ich PowerPoint aus Excel-VBA?
Verwenden Sie CreateObject("PowerPoint.Application") und danach Presentations.Add für eine neue
Präsentation oder Presentations.Open für eine vorhandene Datei. Weil PowerPoint nur als eine Instanz läuft,
prüfen Sie vorher mit GetObject(, "PowerPoint.Application"), ob es bereits lief — so wissen Sie, ob Sie es
am Ende beenden dürfen.
Wie kopiere ich ein Excel-Diagramm per VBA nach PowerPoint?
Rufen Sie Chart.CopyPicture für das Diagramm auf, dann Slide.Shapes.PasteSpecial mit DataType:=2
(ppPasteEnhancedMetafile) oder 6 (ppPastePNG). Fügen Sie direkt nach jedem Kopieren ein und wiederholen
Sie das Einfügen einige Male mit DoEvents dazwischen, weil die Zwischenablage manchmal noch nicht bereit ist.
Warum schlägt mein VBA-Einfügen in PowerPoint zufällig fehl?
Die Kopie ist noch nicht vollständig in der Windows-Zwischenablage angekommen, wenn PowerPoint einfügen will.
Wiederholen Sie das Einfügen in einer kurzen Schleife mit DoEvents und einer Wartezeit von einer Sekunde,
und fügen Sie jedes Element unmittelbar nach dem Kopieren ein.
Warum schließt mein Makro die anderen Präsentationen des Nutzers?
PowerPoint ist ein Einzelinstanz-Programm; Ihr Makro teilt es sich mit jeder Präsentation, die der Nutzer
geöffnet hat, und Application.Quit schließt sie alle. Schließen Sie nur die Präsentation, die Ihr Code
erstellt hat, und beenden Sie PowerPoint nur, wenn es beim Start des Makros nicht lief und keine
Präsentationen mehr offen sind.
Kann ich PowerPoint aus VBA unsichtbar ausführen?
Nicht, indem Sie das Programm ausblenden: Visible auf False zu setzen, löst einen Fehler aus. Erstellen
oder öffnen Sie stattdessen die Präsentation ohne Fenster, mit WithWindow:=0; das PowerPoint-Fenster des
Nutzers bleibt dann, wie es war.
Getestet in
Getestet in: Excel 365 und PowerPoint 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 02.10.2026.
Verwandte Anleitungen: VBA Word · VBA References · VBA CreateObject · VBA Outlook · VBA Chart · VBA Save as PDF · VBA DoEvents · VBA Nothing
