none
Alert me How can I programmatically open Powerpoint without seeing the window? RRS feed

  • Question

  • I have this script that opens the input file, converts it to a .pdf and saves it as the output file.

    However, PowerPoint also opens, and I see the actual window load up.

    This process is going to be running on a server, so I figure that loading up the GUI every time a user wants to convert something is going to be unnecessarily resource intensive.

    Is there any way to programmatically open PowerPoint without the GUI popping up?


    I've tried replacing

    objPPT.Visible = True with

    objPPT.Visible = False

    But that throws an error telling me that it cannot be that way.

    I've also tried replacing

    objPPT.Presentations.Open inputFilewith

    objPPT.Presentations.Open inputFile,,msoFalse

    But that did nothing.

    Here's the script:

    Option Explicit
    
    Sub WriteLine ( strLine )
        WScript.Stdout.WriteLine strLine
    End Sub
    
    ' http://msdn.microsoft.com/en-us/library/office/aa432714(v=office.12).aspx
    Const msoFalse = 0   ' False.
    Const msoTrue = -1   ' True.
    
    ' http://msdn.microsoft.com/en-us/library/office/bb265636(v=office.12).aspx
    Const ppFixedFormatIntentScreen = 1 ' Intent is to view exported file on screen.
    Const ppFixedFormatIntentPrint = 2  ' Intent is to print exported file.
    
    ' http://msdn.microsoft.com/en-us/library/office/ff746754.aspx
    Const ppFixedFormatTypeXPS = 1  ' XPS format
    Const ppFixedFormatTypePDF = 2  ' PDF format
    
    ' http://msdn.microsoft.com/en-us/library/office/ff744564.aspx
    Const ppPrintHandoutVerticalFirst = 1   ' Slides are ordered vertically, with the first slide in the upper-left corner and the second slide below it.
    Const ppPrintHandoutHorizontalFirst = 2 ' Slides are ordered horizontally, with the first slide in the upper-left corner and the second slide to the right of it.
    
    ' http://msdn.microsoft.com/en-us/library/office/ff744185.aspx
    Const ppPrintOutputSlides = 1               ' Slides
    Const ppPrintOutputTwoSlideHandouts = 2     ' Two Slide Handouts
    Const ppPrintOutputThreeSlideHandouts = 3   ' Three Slide Handouts
    Const ppPrintOutputSixSlideHandouts = 4     ' Six Slide Handouts
    Const ppPrintOutputNotesPages = 5           ' Notes Pages
    Const ppPrintOutputOutline = 6              ' Outline
    Const ppPrintOutputBuildSlides = 7          ' Build Slides
    Const ppPrintOutputFourSlideHandouts = 8    ' Four Slide Handouts
    Const ppPrintOutputNineSlideHandouts = 9    ' Nine Slide Handouts
    Const ppPrintOutputOneSlideHandouts = 10    ' Single Slide Handouts
    
    ' http://msdn.microsoft.com/en-us/library/office/ff745585.aspx
    Const ppPrintAll = 1            ' Print all slides in the presentation.
    Const ppPrintSelection = 2      ' Print a selection of slides.
    Const ppPrintCurrent = 3        ' Print the current slide from the presentation.
    Const ppPrintSlideRange = 4     ' Print a range of slides.
    Const ppPrintNamedSlideShow = 5 ' Print a named slideshow.
    
    ' http://msdn.microsoft.com/en-us/library/office/ff744228.aspx
    Const ppShowAll = 1             ' Show all.
    Const ppShowNamedSlideShow = 3  ' Show named slideshow.
    Const ppShowSlideRange = 2      ' Show slide range.
    
    '
    ' This is the actual script
    '
    
    Dim inputFile
    Dim outputFile
    Dim objPPT
    Dim objPresentation
    Dim objPrintOptions
    Dim objFso
    
    If WScript.Arguments.Count <> 2 Then
        WriteLine "You need to specify input and output files."
        WScript.Quit
    End If
    
    inputFile = WScript.Arguments(0)
    outputFile = WScript.Arguments(1)
    
    Set objFso = CreateObject("Scripting.FileSystemObject")
    
    If Not objFso.FileExists( inputFile ) Then
        WriteLine "Unable to find your input file " & inputFile
        WScript.Quit
    End If
    
    If objFso.FileExists( outputFile ) Then
        'WriteLine "Your output file (' & outputFile & ') already exists!"
        'WScript.Quit
    End If
    
    WriteLine "Input File:  " & inputFile
    WriteLine "Output File: " & outputFile
    
    Set objPPT = CreateObject( "PowerPoint.Application" )
    
    objPPT.Visible = True
    
    objPPT.Presentations.Open inputFile
    Set objPresentation = objPPT.ActivePresentation
    Set objPrintOptions = objPresentation.PrintOptions
    
    objPrintOptions.Ranges.Add 1,objPresentation.Slides.Count
    objPrintOptions.RangeType = ppShowAll
    
    ' Reference for this at http://msdn.microsoft.com/en-us/library/office/ff746080.aspx
    objPresentation.ExportAsFixedFormat outputFile, ppFixedFormatTypePDF, ppFixedFormatIntentScreen, msoTrue, ppPrintHandoutHorizontalFirst, ppPrintOutputSlides, msoFalse, objPrintOptions.Ranges(1), ppPrintAll, "Slideshow Name", False, False, False, False, False
    
    objPresentation.Close
    ObjPPT.Quit

    Monday, September 9, 2013 3:02 PM

All replies

  • Re:  "...open powerpoint without seeing the window"

    Have you tried it without the "objPPT.Visible" code line?

    Also, you may want to review the article "Considerations for server-side Automation of Office"...
    http://support.microsoft.com/kb/257757/en-us
    '---
    Jim Cone
    Portland, Oregon USA
    https://goo.gl/IUQUN2 (Dropbox)
    (free & commercial excel add-ins & workbooks)
    • Edited by James Cone Sunday, October 30, 2016 11:54 PM
    Tuesday, September 10, 2013 10:39 AM
  • That doesn't work. It opens powerpoint, which then becomes unresponsive, and crashes.

    But thanks for that article. The article suggests using OpenXML.

    • Edited by G52d9f Tuesday, September 10, 2013 5:03 PM
    Tuesday, September 10, 2013 4:46 PM