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

VBA PowerPoint in Excel — Folien erzeugen, Diagramme einfügen und nie die Präsentation des Nutzers schließen

|

VBA PowerPoint in Excel — Folien erzeugen, Diagramme einfügen und nie die Präsentation des Nutzers schließen

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 .Quit nur 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 .Quit gefä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.Quit schließ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 = False lö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