4
votes

I am trying to export a selected slide to pdf when calling this function.

This code works brilliantly, but gives me the entire slideshow as a PDF.

Sub Export_to_PDF()
    ActivePresentation.ExportAsFixedFormat ActivePresentation.Path & "\" & "ExportedFile" & ".pdf", ppFixedFormatTypePDF, ppFixedFormatIntentPrint
End Sub

How can I alter the above code so that I can specify a slide number or series of slides to be exported to PDF. I need this code to be able to run from the Slideshow view.

Many thanks.

3

3 Answers

3
votes

Ok, so I finally found the answer after months of searching and thought I would share it here plus some additional info based on what I was trying to achieve. Most code is courtesy of random parts found on the net and a bit of my own shonky code.

Sub Generate_PDF_Cert()
'This function saves the last slide as a PDF file with a time stamp and the users name who completed the induction.

timestamp = Now()

Dim PR As PrintRange
Dim lngLast As Long
Dim savePath As String
Dim PrintPDF As Integer


'Location of saved file
savePath = Environ("USERPROFILE") & "\Desktop\Induction\Certificates\" & Format(timestamp, "yyyymmdd-hhnn") & "_" & FirstNameX & "_" & LastNameX & ".pdf"

lngLast = ActivePresentation.Slides.Count

With ActivePresentation.PrintOptions
    .Ranges.ClearAll ' always do this
    Set PR = .Ranges.Add(Start:=lngLast, End:=lngLast)
End With

ActivePresentation.ExportAsFixedFormat _
Path:=savePath, _
FixedFormatType:=ppFixedFormatTypePDF, _
PrintRange:=PR, _
Intent:=ppFixedFormatIntentScreen, _
FrameSlides:=msoTrue, _
RangeType:=ppPrintSlideRange

'Prompt user of file location and option to print.
PrintPDF = MsgBox("A PDF file of this certificate has been saved to: " & vbCrLf & savePath & vbCrLf & vbCrLf & "Would you like to print a copy also?", vbYesNo, "PDF File Created")
If PrintPDF = 6 Then Call Print_Active_Slide


End Sub

So PDF created nice and easy. It basically takes the last slide of the show and exports only that slide to a PDF. This can be changed to a specific slide or range of slides. Then there is an option to also print that selected slide with the following function:

Sub Print_Active_Slide()
' This code determines what slide is currently visible in the
' slide show and then it clears the print range and prints out the
' current slide.


' Declare lSldNum as a long integer.
Dim lSldNum As Long

' Assign lSldNum to the current slide number.
lSldNum = SlideShowWindows(1).View.Slide.SlideNumber

' Set the print options for the active presentation.
With ActivePresentation.PrintOptions

' Set RangeType to print a slide range.
 .RangeType = ppPrintSlideRange

 ' Delete old print range settings.
 .Ranges.ClearAll

 ' Set Ranges to the new range for the current slide.
 .Ranges.Add lSldNum, lSldNum
End With

' Using the current print settings print the slide to the default
' printer.
ActivePresentation.PrintOut

MsgBox "The file has been sent to the default printer", vbOKOnly, "Print Job Sent"

End Sub
2
votes

Thanks, I had the same problem and here is my solution (keeps hyperlinks in pdf):

Sub Main()

    'Hide all slides
    For i = 1 To ActivePresentation.Slides.Count
        ActivePresentation.Slides(i).SlideShowTransition.Hidden = msoTrue
    Next i

    'Show your slides (for example: slide 2 + 4)
    ActivePresentation.Slides(2).SlideShowTransition.Hidden = msoFalse
    ActivePresentation.Slides(4).SlideShowTransition.Hidden = msoFalse

    'Save location
    Dim filePath As String
    filePath = "C:\Users\YOUR_NAME\Desktop\fileName.pdf"
    ActivePresentation.SaveAs filePath, ppSaveAsPDF

    'Show all slides again
    For i = 1 To ActivePresentation.Slides.Count
        ActivePresentation.Slides(i).SlideShowTransition.Hidden = msoFalse
    Next i

End Sub
1
votes

You can also save selected slides to a PDF file using the following method:

Sub Test()

    'select slides
    ActivePresentation.Slides.Range(Array(1, 2, 4, 6, 9, 11)).Select
    'save selected slides to a PDF file
    ActivePresentation.ExportAsFixedFormat Path:="C:\Path\xxx.pdf", _
        FixedFormatType:=ppFixedFormatTypePDF, _
        Intent:=ppFixedFormatIntentPrint, _
        OutputType:=ppPrintOutputSlides, _
        RangeType:=ppPrintSelection

End Sub

However, if you are calling this function from an Excel VBA, it might fail to get the selected slides. So, if you're calling this function from outside of Powerpoint, be sure to activate the slide preview pane first like this:

    Set pptApp = ActivePresentation.Parent 'Powerpoint Application
    pptApp.ActiveWindow.Panes(1).Activate 'You can skip this if you're already in Powerpoint