Mehdi Haghgoo
Mehdi Haghgoo

Reputation: 3484

Automatic slide numbering in PowerPoint using VBA

I have added a label in PowerPoint 2013 with the following code to show "x of y" at the bottom of all slides, where x is current slide number and y is total number of slides:

Private Sub Label1_Click()
Dim p1 As String
p1 = " of "
Dim p2 As Integer
Dim slideNumber As String
slideNumber = ActiveWindow.Selection.SlideRange.slideNumber
p2 = ActivePresentation.Slides.Count
Label1.Caption = slideNumber & p1 & p2

End Sub

The code works perfectly for the slide on which I have added the label e.g. it shows "9 of 29" for slide 9 of my total 29 slides, however when I copy and paste the label on other slides, it still shows "9 of 29" which is wrong as I expect it to automatically reflect the current slide number.

Upvotes: 2

Views: 7242

Answers (3)

Dr Phil
Dr Phil

Reputation: 807

I arrived at this question after doing a Google search for "how do you add page numbers on a powerpoint with vba". I didn't realize the question being asked on this page is actually slightly different.

In case anyone else lands on this question looking for what I was looking for, here's a simpler solution for you.

numSlides = ActivePresentation.Slides.Count
For i = 1 to numSlides
    ActivePresentation.Slides(i).HeadersFooters.SlideNumber.Visible = msoTrue
next i

Upvotes: 0

Jerry T
Jerry T

Reputation: 1690

Here is my solution. Add a new textbox if it does not exist; otherwise use the existing one. That way, you can rerun the macro after making changes to slides.

Sub SlideNum()
For Each oSl In ActivePresentation.Slides
    exist = False
    For Each oS in Osl.Shapes
        If oS.name = "SlideNum" Then
            exist = True
            Exit For
        End If
    Next

    If exist = False Then
        ' convert from inch *72
        Set oshp = oSl.Shapes.AddTextbox(msoTextOrientationHorizontal, 25.55*72, 14.21*72, 1.12*72, 20)
        oshp.name = "SlideNum"
    Else
        Set oshp = oS
    End If
    
    With oshp.TextFrame.TextRange
        ' .Text = CStr(oSl.SlideIndex) & "/" & CStr(ActivePresentation.Slides.Count)
        .Text = CStr(oSl.SlideIndex)
        .Font.Size = 40
    End With
Next

End Sub

Upvotes: 1

Steve Rindsberg
Steve Rindsberg

Reputation: 14809

If you want this to work across all slides, wouldn't it be simpler to have a single button whose click updates all of the slide numbers at one time?

Assuming you have a shape named "SlideNumber" on every slide:

Sub ForExample()
    Dim oSl As Slide

    For Each oSl In ActivePresentation.Slides
        With oSl.Shapes("SlideNumber").TextFrame.TextRange
            .Text = "Slide " & CStr(oSl.SlideIndex) & " of " _
                & CStr(ActivePresentation.Slides.Count)
        End With
    Next

End Sub

Upvotes: 3

Related Questions