Cet exemple montre comment créer plusieurs documents PDF à partir d'un seul classeur Microsoft Excel. Le code parcourt les feuilles de calcul du classeur et crée un fichier PDF par feuille de calcul.

La procédure principale dans le code est PrintSheets()

Cet exemple fonctionne pour Windows 32 et 64 bits.

    Option Explicit
    Private Declare PtrSafe Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" ( _
    ByVal lpAppName As String, _
    ByVal lpKeyName As String, _
    ByVal lpDefault As String, _
    ByVal lpReturnedString As String, _
    ByVal nSize As Long) As Long
    Private Const MAX_PRINTERS = 32&
    Private strPrinterNames(MAX_PRINTERS) As String
    Private strPrinterDrivers(MAX_PRINTERS) As String
    Private strPrinterPorts(MAX_PRINTERS) As String
    Private intPrinterCount As Integer
    Sub PrintSheetsAsPDF()
    PrintSheets
    End Sub
    Sub PrintSheets(Optional sFileName As String = "", Optional confirmOverwrite As Boolean = True)
    Dim oPrinterSettings As Object
    Dim oPrinterUtil As Object
    Dim sFolder As String
    Dim sCurrentPrinter As String
    Dim sPrintername As String
    Dim sFullPrinterName As String
    Dim sStatusFileName As String
    Rem -- Documentation of the used COM interface is available at the link below.
    Rem -- https://www.7-pdf.com/sites/default/files/guide/dotnet/chm/html/T_pdf7_PdfWriter_PdfSettings.htm
    Rem -- Create the objects to control the printer settings.
    Set oPrinterSettings = CreateObject("pdf7.PdfSettings")
    Set oPrinterUtil = CreateObject("pdf7.PdfUtil")
    Rem -- Get default printer name
    sPrintername = oPrinterUtil.DefaultPrintername
    oPrinterSettings.Printername = sPrintername
    Rem -- Remember variable for current printer selection
    sCurrentPrinter = ActivePrinter
    Rem -- Change to default PDF printer name "7-PDF Printer"
    SetToPDFPrinter
    Rem -- Set the output folder
    sFolder = Environ("USERPROFILE") & "\Desktop\PDF Example"
    Dim sht As Worksheet
    For Each sht In Worksheets
    Rem -- Create a file name for the sheet
    sFileName = sFolder & "\" & sht.Name & ".pdf"
    Rem -- Create a file name for the status file
    sStatusFileName = sFolder & "\status-" & sht.Name & ".ini"
    Rem -- Remove the status file if it already exists
    If Dir(sStatusFileName) <> "" Then Kill sStatusFileName
    Rem -- Write the settings to the printer
    Rem -- Settings are written to the runonce.ini
    Rem -- This file is deleted immediately after being used.
    With oPrinterSettings
    .SetValue "Output", sFileName
    .SetValue "ConfirmOverwrite", "no"
    .SetValue "ShowSettings", "never"
    .SetValue "ShowPDF", "yes"
    .SetValue "StatusFile", sStatusFileName
    .WriteSettings True
    End With
    sht.PrintOut
    Rem -- Wait for the status file to appear.
    Rem -- This makes sure that we don't overwrite a waiting runonce.ini.
    If Not oPrinterUtil.WaitForFile(sStatusFileName, 10000) Then
    MsgBox "An error occured. No status file was found."
    Exit Sub
    End If
    Next
    Rem -- Restore the printer selection
    ActivePrinter = sCurrentPrinter
    End Sub
    Public Sub SetToPDFPrinter()
    Dim strBuffer As String
    Dim intIndex  As Integer
    Dim blnFound As Boolean
    strBuffer = Space$(&H2000)
    GetProfileString "PrinterPorts", vbNullString, "", _
    strBuffer, Len(strBuffer)
    GetPrinterNames strBuffer
    GetPrinterPorts
    For intIndex = 0 To intPrinterCount - 1
    If strPrinterNames(intIndex) = "7-PDF Printer" Then
    Application.ActivePrinter = strPrinterNames(intIndex) & " auf " _
    & strPrinterPorts(intIndex)
    blnFound = True
    Exit For
    End If
    Next
    If Not blnFound Then MsgBox "Printer not found", vbExclamation, "Notice"
    End Sub
    Private Sub GetPrinterNames(ByVal strBuffer As String)
    Dim intIndex As Integer
    Dim strName As String
    intPrinterCount = 0
    Do
    intIndex = InStr(strBuffer, Chr(0))
    If intIndex > 0 Then
    strName = Left$(strBuffer, intIndex - 1)
    If Len(Trim$(strName)) > 0 Then
    strPrinterNames(intPrinterCount) = Trim$(strName)
    intPrinterCount = intPrinterCount + 1
    End If
    strBuffer = Mid$(strBuffer, intIndex + 1)
    Else
    If Len(Trim$(strBuffer)) > 0 Then
    strPrinterNames(intPrinterCount) = Trim$(strBuffer)
    intPrinterCount = intPrinterCount + 1
    End If
    strBuffer = ""
    End If
    Loop While (intIndex > 0) And (intPrinterCount < MAX_PRINTERS)
    End Sub
    Private Sub GetPrinterPorts()
    Dim strBuffer As String
    Dim intIndex As Integer
    For intIndex = 0 To intPrinterCount - 1
    strBuffer = Space$(&H400)
    GetProfileString "PrinterPorts", strPrinterNames(intIndex), "", _
    strBuffer, Len(strBuffer)
    GetDriverAndPort strBuffer, strPrinterDrivers(intIndex), _
    strPrinterPorts(intIndex)
    Next
    End Sub
    Private Sub GetDriverAndPort(ByVal Buffer As String, _
    DriverName As String, PrinterPort As String)
    Dim intDriver As Integer
    Dim intPort As Integer
    DriverName = ""
    PrinterPort = ""
    intDriver = InStr(Buffer, ",")
    If intDriver > 0 Then
    DriverName = Left$(Buffer, intDriver - 1)
    intPort = InStr(intDriver + 1, Buffer, ",")
    If intPort > 0 Then
    PrinterPort = Mid$(Buffer, intDriver + 1, _
    intPort - intDriver - 1)
    End If
    End If
    End Sub
    

Vous pouvez télécharger et exécuter l'exemple vous-même (fichier Excel avec code macro fini). Le fichier Excel requis est disponible ici.

Téléchargements

appendice taille
Télécharger l'exemple de code 63.8 KB

Top