I'm often asked how to control print settings when using a macro to print from Outlook. In most cases you can't, because the print dialog is not exposed in the object model. You can use Windows Shell to print any document type, using the native application, assuming you have an application installed that can open and print the file type, but you can't set options, such as page numbers, using Windows Shell.
If the application supports OLE, you may be able to control some aspects of the printout. For example, if you are printing a PDF and have Adobe Acrobat installed, you can use the PrintPages function in the Acrobat object model to print selected pages and shrink to fit the page.
Function PrintPages(nFirstPage As Long, nLastPage As Long, nPSLevel As Long, bBinaryOk As Long, bShrinkToFit As Long) As Boolean
Call the function in the macro using this format:
Call AcroExchAVDoc.PrintPages(0, 1, 2, 1, 1)
The page count begins with 0, not 1, so to print the first 3 pages, you'd use 0 and 2 as the first 2 values:
Call AcroExchAVDoc.PrintPages(0, 2, 2, 1, 1)
To print only page 2, use 1 and 1 as the first 2 values:
Call AcroExchAVDoc.PrintPages(1, 1, 2, 1, 1)
To use this code in Office applications, you need to set a reference to Acrobat in the VB Editor's Tools, References dialog box.
In the sample code below, pass the FileName and optional PrintMode values to the macro using
AcrobatPrint "c:\My Documents\my-file.pdf", "All"
or
AcrobatPrint "c:\My Documents\my-file.pdf"
Public Sub AcrobatPrint(FileName As String, PrintMode As String) Dim AcroExchApp As Acrobat.CAcroApp Dim AcroExchAVDoc As Acrobat.CAcroAVDoc Dim AcroExchPDDoc As Acrobat.CAcroPDDoc Dim num As Integer Set AcroExchApp = CreateObject("AcroExch.App") Set AcroExchAVDoc = CreateObject("AcroExch.AVDoc") ' Open the [Filename] pdf file AcroExchAVDoc.Open FileName, "" 'Get the PDDoc associated with the open AVDoc Set AcroExchPDDoc = AcroExchAVDoc.GetPDDoc 'Get the number of pages for this pdf num = AcroExchPDDoc.GetNumPages - 1 If PrintMode = "All" Then 'Print Entire Document Call AcroExchAVDoc.PrintPages(0, num, 1, 1, 1) Else If num = 0 Then 'Print one page document Call AcroExchAVDoc.PrintPages(0, num, 2, 1, 1) Else 'Print first two pages Call AcroExchAVDoc.PrintPages(0, 1, 1, 1, 1) End If End If AcroExchApp.Exit AcroExchAVDoc.Close (True) AcroExchPDDoc.Close End Sub
More Information
Developing Applications Using Interapplication Communication