Select Page

In a recent LinkedIn discussion, a question was asked by a VBA developer about two different methods for adding a new slide to a presentation using VBA within PowerPoint.

In this post, we explore the old Add method and the new AddSlide method and create a free wrapper function that you can use to take advantage of Microsoft’s IntelliSense feature within the VBE.

PowerPoint 2003

With the PowerPoint 2003 and earlier object model, the Add method was used:

' PowerPoint 2003 and earlier
Public Sub AddSlide()

    Dim pptSlide As Slide

    Set pptSlide = ActivePresentation.Slides.Add (1, ppLayoutText)

End Sub

This was very easy to use since IntelliSense showed you the list of possible layouts immediately after you typed the comma: - VBA Wrapper - Add - IntelliSense

PowerPoint 2007, 2010, 2013

In the new Slide Master object model (from PowerPoint 2007), a new AddSlide method was introduced whereby you need to first create a reference to the slide’s CustomLayout:

' PowerPoint 2007 and later
Public Sub AddSlide()

    Dim pptSlide As Slide
    Dim pptLayout As CustomLayout

    Set pptLayout = ActivePresentation.Slides(1).CustomLayout
    Set pptSlide = ActivePresentation.Slides.AddSlide(2, pptLayout)

End Sub

The new method is not as convenient because IntelliSense does not show you the list of available Custom Layouts as you are typing.

The solution is to write a wrapper function that uses a custom variable enumeration as shown below. Now when you call our custom AddSlide function, IntelliSense shows you the list of Custom Layouts to choose from: - VBA Wrapper - AddSlide - IntelliSense

Option Explicit

' You can get the names of all the layouts using the developer function below
Public Enum pptLayout
    myTitle = 1
    myTitleContent = 2
    mySectionHeader = 3
    myTwoContent = 4
    myComparison = 5
    myTitleOnly = 6
    myBlank = 7
    myContentCaption = 8
    myPictureCaption = 9
    myTitleVerticalText = 10
    myVerticalTitleText = 11
End Enum

Public Sub AddSlide()
    Dim myNewSlide As Slide
    ' Create a new Section slide at the end of the presentation
    Set myNewSlide = GetNewSlide(mySectionHeader)
    ' Create a new Title and Content slide in position 2
    Set myNewSlide = GetNewSlide(myTitleContent, 2)
End Sub

' Wrapper function for PowerPoint 2007, 2010, 2013
' to add and return a new slide at the end or defined place in the presentation
' Calling the function enables IntelliSense to use and display the custom pptLayout enumeration
Public Function GetNewSlide(myLayout As pptLayout, Optional SlidePosition As Integer) As Slide
    Dim NewSlideIndex As Integer
    Dim NewSlideLayout As CustomLayout

    Select Case myLayout
        Case 1 To 11
            Set NewSlideLayout = ActivePresentation.SlideMaster.CustomLayouts(myLayout)
        Case Else
            Set NewSlideLayout = ActivePresentation.SlideMaster.CustomLayouts(2)
    End Select

    ' Set the new slide index to either the value passed to the funtion or the last slide + 1 in the deck
    NewSlideIndex = IIf(SlidePosition = 0, ActivePresentation.Slides.Count + 1, SlidePosition)
    ' Create the new slide
    Set GetNewSlide = ActivePresentation.Slides.AddSlide(NewSlideIndex, NewSlideLayout)

End Function

You can get the names of all of the Custom Layouts in the current presentation with the following function:

' Developer function to print the custom layout names in the immediate window (Ctl+G)
' Used to create the custom enumeration

Public Function GetCustomLayoutNames()

    Dim pptLayout As CustomLayout

    For Each pptLayout In ActivePresentation.SlideMaster.CustomLayouts
        Debug.Print pptLayout.Index & " : " & pptLayout.Name

End Function

Need Help with VBA Programming?

We provide an extensive range of VBA macro and add-in development services so why not contact us to discuss your needs?