Automatiser l’impression d’un classeur Excel en PDF via PDFCreator

Suite à l’article Automatiser l’impression d’un état en PDF via PDFCreator, un lecteur du blog m’a demandé si c’était possible de faire la même chose pour Excel uniquement. Il faut juste quelques petits aménagements pour transformer le code Access en un code Excel. Voici donc, pour une fois, un article qui s’applique uniquement à Excel…

Si vous avez manqué le début…

Consultez l’article cité plus haut avant toute chose. Vous y verrez comment, dans votre projet Excel, faire une référence à la bibliothèque PDFCreator.

Le code VBA

Voici la procédure VBA adaptée de l’article précédent, et adaptée spécifiquement pour Excel. Recopiez tout ce code dans un module standard de votre classeur Excel (ou dans le classeur de macros personnelles, si vous souhaitez le réutiliser souvent).

Exemple 1

La procédure reçoit 2 paramètres en entrée, les 2 étant facultatifs :

  • Le nom du fichier PDF à générer. Par défaut, le nom du classeur sera repris, sinon.
  • Le dossier de stockage du PDF. Par défaut, il s’agit du dossier Documents de l’utilisateur. Si vous travaillez sur Windows Vista ou 7, remplacez le "Mes documents" par "Documents", dans le code, sinon ça ne marchera pas.

Voici un exemple d’appel simple du code VBA :

Exemple 2

Voici un 2ème exemple. Cette fois, on sélectionne au préalable 2 feuilles du classeurs, pour les imprimer dans le même PDF :

56 réponses

  1. Bobbretagne dit :

    Bonjour,
    merci pour cela, mais avec pdfcreator 2.2.2, cela ne fonctionne plus.
    As tu une solution autre que mettre la version pdfcreator 1.7.3
    merci

  2. dit :

    Déjà, grand merci. Enorme.

    Ensuite, question de probablement bleu-bite: j’ai intégré le code, ça fonctionne, mais pourquoi l’interpréteur rale-t-il quand je mets un second paramètre? Il attend un « = ». Votre appel est fait sans parenthèses, j’ai essayé avec/sans… idem. Merci de votre aide.

  3. Hervé Inisan dit :

    Toy > Vu de loin, ça pourrait donner quelque chose comme ce qui suit (à adapter en lisibilité, je n’ai mis aucun séparateur dans le nom de fichier). Il faudra aussi s’assurer que la cellule ne contient pas de caractère incompatible avec un nom de fichier.

  4. Toy dit :

    Bonjour, je souhaiterais définir le nom du PDF généré de la manière suivante : un texte fixe + nom de la feuille et une case précise de la feuille. J’ai 5 feuilles sur lesquelles je dois appliquer ce même format de nom de fichier.
    J’ai fait plusieurs essais et systématiquement la pop-up de PDF Creator m’affiche toujours le nom du fichier Excel et non ce que j’indique dasn la variable « strpdfname ». Pourrais je avoir un coup de main, svp.

  5. Hervé Inisan dit :

    Juanito > Content que tu aies pu trouver une solution…

  6. Juanito dit :

    En constatant que sur une page de mon fichier je n’avais pas le même problème, j’ai comparé les deux pages.
    Il semblerait que ce problème apparaît lorsqu’on souhaite avoir un titre qui se reporte sur plusieurs pages avec la mise en page « ligne à répéter en haut ».
    Je pense que cela vient de cette propriété, car lorsque j’ai recréé la page je n’ai pas eu le problème jusqu’à vouloir répéter la ligne en haut. Mais ce n’est qu’une supposition car en supprimant ce paramètre de ma page défaillante, je m’attendais à ne plus avoir le problème à l’impression hors il a persisté.

    J’ai donc recréé mes pages à imprimer sans utiliser la propriété pour répéter les lignes et mon fichier à l’air de fonctionner.

    Encore un grand merci pour cette marco, et le suivi qui continu d’être effectué.

  7. Juanito dit :

    Bonjour,

    Je cherche encore la source du problème.
    Je viens de me rendre compte que sur une page de mon fichier excel, ce problème ne se produisait pas, mais je ne vois pas la différence avec les autres pages.

    Je vais tenter quelques expériences sur les marges.

    PS : je suis sur excel en non Access.

  8. Hervé Inisan dit :

    Juanito > Difficile à dire, mais est-ce qu’il pourrait y avoir quelque chose au niveau de marges ou de taille de papier par défaut ?

    Ça se produit toujours sur un état Access précis, ou sur tous les états ?

  9. Juanito dit :

    Bonjour,

    Tout d’abord merci pour cette macro qui fonctionne très bien
    (pas de bug lors de l’intégration à un autre projet).

    J’ai par contre un souci avec le fichier pdf créé. Il manque le tiers inférieur de la page.
    Hors si je lance l’impression manuellement avec pdfcréator, sans changer aucune mise en page (zone d’impression, etc), la page est bien complète.
    Si après avoir fait l’impression avec pdfcréator, je relance la même l’impression via la macro la page est, à ce moment là, complète.

    Je ne comprend pas quels paramètres changent entre les deux opérations.

    Le problème revient à chaque fois que j’ouvre le fichier (je suis obligé de faire une impression à la main avec pdfcréator), pour que la macro fonctionne correctement.

    Avez-vous une idée ?

    Merci d’avance

  10. Hervé Inisan dit :

    tintinsge > Le code principal (la macro SaveAsPDF) ne se lance pas tout seul effectivement, il est prévu pour être paramétré et réutilisé par des macros de plus haut niveau. C’est aussi ce qui explique pourquoi il n’apparaît pas dans la fenêtre Macros d’Excel : à cause des 2 paramètres strPDFName et strDirectory.

    Par contre, si tu recopies l’une des 2 autres macros (Test1 ou Test2), elle devrait être visible dans Excel (donc pouvoir être exécutée manuellement ou, plus tard être associée à un bouton).

  11. Hervé Inisan dit :

    Kevin > Je vois. Il y a une option (manuelle et en VBA) dans PDFCreator pour fusionner plusieurs PDF en liste d’attente. Je n’ai pas encore d’article ni d’exemple sur le sujet, ça fera l’objet d’un article un jour.

    En VBA, l’instruction est une méthode d’objet (.cCombineAll). Il y a un exemple VBScript (mais pas VBA) fourni dans le sous-dossier COMWindows Scripting HostVBScripts, dans le dossier d’installation de PDFCreator.

    A noter que si la gestion des documents était faite sous Access, un seul état Access suffirait, et il n’y aurait pas besoin de combiner de documents. 😉

  12. tintinsge dit :

    Bonjour,
    J’ai copier le code entier d’Hervé dans un module. Mais il ne se lance pas. Il n’est même pas détecté dans la liste des macros.
    Savez-vous pourquoi ?
    Pour info je suis en EXCEL 2002
    Merci

  13. Kevin dit :

    Bonjour Hervé

    Effectivement, c’est très jouable. Par contre je me suis un peu mal exprimé. La boucle proposé pour imprimé plusieurs feuilles me donnera autant de fichier .pdf que j’aurai de feuille. Ce que je voudrais c’est mettre dans une file d’atente l’ensemble de mes fichiers .pdf et une fois sorti de la boucle les fondres dans un seul .pdf

    merci beaucoup

    Kevin

  14. Hervé Inisan dit :

    moy08 > Super, content que ça marche ! 🙂

  15. moy08 dit :

    Bonsoir,

    Finalement, je suis reparti de votre code. J’ai trouvé que c’était beaucoup plus simple !

    Et ça a marché du premier coup !

    Un grand merci pour votre aide et pour votre tutoriel extrêmement intéressant et très complet. Je ne voyais pas du tout comment m’en sortir.

    Encore merci et bravo.

    Moy08.

  16. Hervé Inisan dit :

    Kevin > Sur le principe, c’est possible. Il faudrait :

    1. Modifier les données sur la feuille.
    2. Lancer une impression PDF.
    3. Recommencer au point 1.

    Un peu difficile à préciser dans un commentaire, mais en tout cas, ce serait jouable. 😉

  17. Hervé Inisan dit :

    moy08 > Le fait de remplacer les paramètres par des valeurs « en dur » est plus pratique pour la mise au point du code. Par contre, le code devient moins réutilisable pour d’autres scénarios. J’aurais conservé les paramètres d’entrée. 😉

    Sinon, il y a sans doute un problème au niveau du Format() : un chemin de fichier ne peut pas contenir de / ou , puisque ce sont des séparateurs de dossiers. C’est pour cette raison que j’avais mis des tirets.

    Ouala !

  18. moy08 dit :

    Bonjour,

    Merci encore pour votre aide.

    J’ai avancé en respectant vos consignes, mais la macro ne fonctionne pas : l’impression en pdf démarre correctement (soit en allant directement dedans, soit en cliquant sur les boutons de commande associés des six onglets), mais les fichiers ne s’enregistrent pas et j’ai le message d’erreur de la macro (« Une erreur s’est produite … »).
    Comme le répertoire de destination et le nom du fichier sont toujours définis, j’ai enlevé tout ce qui était lié à une option, ce qui donne le code suivant :

    Option Explicit

    ‘ Ne pas oublier de cocher la bibliothèqe PDFCreator
    ‘ dans le menu Outils / Références de Visual Basic Editor

    ‘ API Windows pour faire une temporisation en millisecondes
    Private Declare Sub Sleep Lib « kernel32 » (ByVal dwMilliseconds As Long)

    ‘ Constantes pour les temporisations
    Private Const maxTime = 10 ‘ en secondes
    Private Const sleepTime = 250 ‘ en millisecondes

    ‘ —
    ‘ IMPRESSION D’UN CLASSEUR EXCEL EN PDF
    ‘ —
    ‘ Entrée : strPDFName <- Nom du fichier PDF à générer
    ‘ strDirectory <- Chemin de stockage du fichier PDF

    Sub SaveAsPDF()

    ‘ Quelques variables…
    Dim pdfc As PDFCreator.clsPDFCreator
    Dim DefaultPrinter As String
    Dim c As Long
    Dim OutputFilename As String
    Dim strDirectory As String
    Dim strPDFName As String

    ‘ Instancier un nouvel objet PDFCreator
    Set pdfc = New clsPDFCreator

    ‘ Paramétrer l’objet PDFCreator
    With pdfc
    .cStart « /NoProcessingAtStartup »

    ‘ Chemin de destination
    strDirectory = « G:……Relances »

    ‘ Nom du fichier PDF à générer
    strPDFName = ActiveSheet.Name &  » –  » & Format(Now, « dd/mm/yyyy ») & « .pdf »

    ‘ Format de sauvegarde (0 = PDF)
    .cOption(« AutosaveFormat ») = 0

    ‘ Mémoriser l’imprimante par défaut
    ‘ et définir PDFCreator à la place
    DefaultPrinter = .cDefaultPrinter
    .cDefaultPrinter = « PDFCreator »
    .cClearCache

    ‘ Imprimer les feuilles sélectionnées
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

    .cPrinterStop = False
    ‘ End With

    ‘ Temporisation
    c = 0
    Do While (pdfc.cOutputFilename = «  ») And (c < (maxTime * 1000 / sleepTime))
    c = c + 1
    Sleep 200
    Loop

    ‘ Nom du fichier PDF produit
    OutputFilename = pdfc.cOutputFilename

    ‘ Réinstaller l’imprimante d’origine
    With pdfc
    .cDefaultPrinter = DefaultPrinter
    Sleep 200
    .cClose
    End With

    ‘ Attendre jusqu’à ce que PDFCreator soit supprimé de la mémoire
    Sleep 2000

    ‘ Vérifier si le fichier a été créé
    If OutputFilename = «  » Then
    MsgBox « Création du fichier PDF. » & vbCrLf & vbCrLf & _
    « Une erreur s’est produite : temps écoulé ! », vbExclamation + vbSystemModal
    End If

    End With

    End Sub

    J’ai sans doute enlevé trop de code ! Auriez-vous l’amabilité de me dire où ça cloche ?

    Merci d’avance.

    Cordialement.

    Moy08

  19. Kevin dit :

    Wow !!!!
    J’aime bien trouver exactement ce que je cherche et que se soit si bien expliquer !!!!
    Par contre, je me demandais si c’étais possible d’imprimer plusieurs fois la même page avec des données différentes.
    En fait, je produit des rapports stadardisé pour plusieurs système. Donc j’ai simplement un rapport et selon le système que je place dans ma cellule Titre, les données se mettent à jour sur mon rapport. Pour la consultation en ligne c’est génial, mais pour l’impression en .pdf c’est un peu long. Est-ce que l’on peu placer ta macro dans un boucle et qu’elle m’imprime un seul .pdf de chacune des pages ?

    Merci beaucoup

  20. Hervé Inisan dit :

    moy08 > Quelques réponses :

    1. Le chemin est indiqué dans le deuxième paramètre de la procédure SaveAsPDF(). Par exemple : SaveAsPDF "test.pdf", "G:Test"
    2. Pour que le fichier contienne l’onglet, je suppose qu’on n’imprime qu’un seul onglet à la fois. Dans ce cas, il faudrait écrire quelque chose comme : SaveAsPDF ActiveSheet.Name & " - " & Format(Now, "dd-mm-yyyy") & ".pdf"
    3. Il faut surtout un exemplaire (et un seul) de la macro SaveAsPDF. Ensuite, soit 6 macros différentes (si les onglets sont imprimés séparément et associés à un bouton différent) ; ces 6 macros appelant SaveAsPDF avec les paramètres qui vont bien. Soit une seule macro pilotant SaveAsPDF, si les 6 onglets sont imprimés à chaque fois en une opération.
  21. moy08 dit :

    Bonjour,

    Je trouve votre article extrêmement intéressant et je suis sûr que la macro que vous donnez me sera très utile, quand je l’aurai comprise !

    Je débute en effet avec les macros et j’ai beaucoup de mal à adapter votre macro à mon cas.

    En fait, j’ai un fichier Excel avec plusieurs onglets pour l’édition de tableaux de relance qui sont envoyés par mail aux centres concernés de mon entreprise. Il existe un onglet pour chacun des six centres concernés (centre A, B, C, D, E, F).
    J’ai mis un bouton de commande dans chaque onglet pour générer une macro différente.

    Je me pose les questions suivantes (désolé, mais elles sont très basiques) :

    1°) à quel endroit de votre macro dois-je indiquer que le fichier doit être enregistré dans le répertoire G:/…. ?

    2°) je voudrais que le fichier imprimé en pdf soit enregistré sous le nom de l’onglet et la date du jour de l’édition : exemple « centre B – 04/07/2013.pdf ». Comment puis-je faire ?

    3°) enfin, comme j’ai six centres, j’ai jusqu’à présent six macros (chaque bouton de commande appelant une macro différente). Puis-je ne garder qu’une seule macro ? et si oui, comment ?

    Sous ces deux réserves, pensez-vous que je puisse transférer votre macro « telle quelle » à la place de la mienne ?

    Je vous remercie d’avance pour votre aide qui me sera très précieuse.

    Bien cordialement.

  22. Hervé Inisan dit :

    Cam > Je n’ai pas de quoi tester le A3 ici, mais quelques pistes quand même :

    1. Est-ce que le saut de page est un saut de page automatique ou manuel ? Dans le premier cas, ça pourrait expliquer le phénomène.
    2. Je vois un facteur de zoom. Est-ce qu’il peut aussi avoir un impact ?
  23. Cam dit :

    Bonjour et vraiment bravo pour ce travail titanesque ! Un grand merci aussi de l’avoir partagé.

    Pour ma part, votre macro me permet d’imprimer dans un fichier pdf un rapport que je souhaite dans un format spécifique : en A3 et en mode paysage… ce que j’ai inséré dans votre exemple 1 et qui fonctionne parfaitement. Toutefois, le rapport a vocation a être imprimé en recto-verso et les sauts de pages sont donc indispensables ! Or, à chaque lancement de la macro, mon saut de page en ligne 55 passe en ligne 47 et je n’en comprends pas la raison… Pourriez-vous m’aider ?

    Voici le code que j’utilise actuellement, dérivé de l’exemple 1 :

    Public Sub Test1()
    ‘ Imprimer seulement la feuille en cours
    Sheets(« Services »).Select

    With ActiveSheet.PageSetup
    .LeftMargin = Application.InchesToPoints(0.393700787401575)
    .RightMargin = Application.InchesToPoints(0.393700787401575)
    .TopMargin = Application.InchesToPoints(0.393700787401575)
    .BottomMargin = Application.InchesToPoints(0.393700787401575)
    .HeaderMargin = Application.InchesToPoints(0.31496062992126)
    .FooterMargin = Application.InchesToPoints(0)
    .PrintHeadings = False
    .PrintGridlines = False
    .PrintComments = xlPrintNoComments
    .CenterHorizontally = True
    .CenterVertically = True
    .Orientation = xlLandscape
    .Draft = False
    .PaperSize = xlPaperA3
    .FirstPageNumber = xlAutomatic
    .Order = xlDownThenOver
    .BlackAndWhite = False
    .Zoom = 94
    .PrintErrors = xlPrintErrorsDisplayed
    End With

    SaveAsPDF « pôle_cam.pdf »
    End Sub

    Cordialement,

    Cam

  24. Hervé Inisan dit :

    Christophe > Merci pour le retour… et content que ça puisse aider ! 🙂

  25. Christophe dit :

    Bonjour,

    Juste un grand remerciement pour ce code. Il correspond exactement à mes besoins avec des explications claires.

    Bonne continuation.

  26. Hervé Inisan dit :

    GhosT > Qu’est-ce que tu veux dire par : « les pages contenues dans la dernier classeur » ?

  27. GhosT dit :

    Bonjour,
    Je n’arrive pas à imprimer deux classeurs (Feuille 1 et 2) dans le même PDF. La macro ne tombe pas en erreur mais je récupère que les pages contenue dans la dernier classeur: pourtant je réalise bien le : « Sheets(Array(…,…)).Select

    Quelqu’un peut il m’aider. Je suis sous Excel 2003
    (j’ai vu sur le net que maintenant à partir de la version 2007 on peut réaliser cette opération sans PDF Creator : http://www.microsoft.com/fr-fr/down
    http://forum.hardware.fr/hfr/Window…)

  28. Hervé Inisan dit :

    July > L’idée est d’assembler en un PDF les feuilles 1 et 2 ?

  29. July dit :

    Bonjour,
    Je me suis servie de votre travail qui m’a franchement beaucoup aider donc merci 🙂

    Cependant je suis un peu bloquée, je suis sur le Test 2 qui est donc de mettre plusieurs feuilles au format PDF.

    Est-ce que de mettre plutôt des selections de plusieurs feuilles dans un même PDF?

    Si oui, pouvez-vous m’indiquer comment faire svp?

    Je vous remercie d’avance pour votre réponse

  30. Hervé Inisan dit :

    lepotier > Le « Subscript out of range » signifie que ton indice (ix) n’est pas bon à un moment donné. Essaie de tracer cette variable pour voir où cela se produit. Pour ma part, je lancerais le Redim avant d’alimenter le tableau, plutôt que l’inverse (dans ton cas, le tableau a toujours une taille de plus que le nombre de valeurs exactes).

  31. lepotier dit :

    Pas tout à fait…

    J’ai une erreur Subscript out of range… Sur mon ReDim Preserve arraySheet(ix) ‘Je ne comprends pas pourquoi…

    For Each ws In wb.Worksheets
    With ws
    If .UsedRange.Address = « $A$1 » And .Range(« A1 ») = «  » Then
    MsgBox (ws.Name &  » is empty »)
    Else
    arraySheet(ix) = ws.Name
    ix = ix + 1
    ReDim Preserve arraySheet(ix)
    End If
    End With

    Next ws

    ReDim Preserve arraySheet(ix)

    Sheets(arraySheet).Select

    SaveAsPDF «  »

    Je sais que cela plus rien à voir avec ton script mais tu as une idée ?

  32. Hervé Inisan dit :

    lepotier > Du coup, tu as pu résoudre le problème ?

  33. lepotier dit :

    Hervé> Bonjour Hervé,
    Tout à fait ‘:)
    Merci pour ta réponse,

  34. Hervé Inisan dit :

    lepotier > Dans le code, j’ai un ActiveWindow qui sert de base pour l’impression de la sélection. Je vois que de ton côté tu utilises une variable Workbook (wb). Est-ce que ça peut venir de là ?

    Sinon, si le but est d’imprimer toutes les feuilles, tu n’as pas besoin du tableau et de la boucle pour les obtenir. Un Sheets.Select peut suffire.

  35. lepotier dit :

    Bonjour,

    Super script !
    Moi, je rempli le array dynamiquement, mais il n’imprime que la dernière sheet, une idée ?

    Dim arraySheet() As String
    For Each ws In wb.Worksheets
    ReDim Preserve arraySheet(ix)
    arraySheet(ix) = ws.Name
    ix = ix + 1
    Next ws

    wb.Sheets(arraySheet).Select
    SaveAsPDF « 2sheet.pdf »

    Merci d’avance 😉

  36. Hervé Inisan dit :

    Philippe > Est-ce que les propriétés du format PDF (dans les options de PDFCreator) sont correctes ? Notamment, le modèle de couleurs devrait être autre chose que « Niveaux de gris ».

  37. Philippe dit :

    Bonjour et merci pour cette macro excel très utile avec le développement des fichiers au format pdf.

    Par contre je rencontre un problème, car je n’arrive pas à obtenir un pdf en couleur.
    Y-a-t-il une solution à ce problème. J’ai essayé diverses solutions consistant à modifier les propriétés de l’imprimante par défaut, puis de pdf creator mais sans succès.

    D’avance merci

  38. Hervé Inisan dit :

    Jarod > Pour spécifier le chemin, il n’est pas nécessaire de le changer dans la déclaration (Optional...). Il suffit de le passer en argument 2. Et pour modifier le nom du fichier en fonction d’une cellule, il faut donner la référence de cette cellule en argument 1. Par exemple :

  39. Jarod dit :

    Bonjour
    Merci pour pour ce module mais j’ai besoin d’aide
    Je voudrais le chemin donné en partie par une cellule :
    Optional ByVal strDirectory As String = « C:UsersFABRICEDownloadscontenu cellule A1 »)
    et est-il possible d’imprimer la Feuill1 sans l’afficher pour rester sur la feuille active
    Merci

  40. Hervé Inisan dit :

    benjamin > On peut alimenter le 1er paramètre (strPDFName) lors de l’appel de la macro. Ici, le nom du PDF sera donné par la cellule B5 de la feuille 2 :

  41. benjamin dit :

    bonjour et merci hervé pour votre message

    parcontre concernant ma question 2): je souhaite recuperer la valeur d’un champ d’une feuille excel pour sauver ce fichier pdf sous ce meme nom comment puis je proceder je sais qu’il existe une fonction str pdfname mais ne sait comment l’utiliser, comment dois je modifier ce programme pour arriver a ce resultat

    par avance merci

  42. Hervé Inisan dit :

    benjamin > Le code que tu cites est prévu pour un autre emploi. Il n’est pas utile de recopier mon code « dans » celui-là, tu peux tout simplement recopier le mien (dans un module de ton classeur, par exemple). Ensuite, tu peux aussi reprendre le bout de code de l’exemple 2 (dans le même module, à la suite). Puis exécuter la procédure Test2.

    Reposte ici si tu as besoin de précisions.

  43. benjamin dit :

    Bonjour et tout dabord merci pour le travail que vous réalisez.
    je suis debutant dans l’utilisation de ces programme.
    j’aurais deux questions:
    1) je souhaite imprimer 2 feuilles du classeurs excel, pour les imprimer dans le même PDF (l’exemple 2 que vous donnez) mais ou le copier dans le programme ci dessous.

    2) autre question, je souhaite recuperer la valeur d’un champ d’une feuille excel pour sauver ce fichier pdf sous ce meme nom

    par avance merci pour vos réponses

    Private Sub CommandButton1_Click()
    PrintToPDF_Early
    End Sub
    Sub PrintToPDF_Early()
    ‘Author : Ken Puls (Excelguru.ca | Tips and pointers for Excel and other MS Office applications)
    ‘Macro Purpose: Print to PDF file using PDFCreator
    ‘ (Download from SourceForge.net: PDFCreator)
    ‘ Designed for early bind, set reference to PDFCreator
    Dim pdfjob As PDFCreator.clsPDFCreator
    Dim sPDFName As String
    Dim sPDFPath As String
    ‘/// Changer le nom du fichier de sortie sur la lign cidessous: ///
    sPDFName = « testPDF.pdf »
    sPDFPath = ActiveWorkbook.Path & Application.PathSeparator

    ‘Check if worksheet is empty and exit if so
    If IsEmpty(ActiveSheet.UsedRange) Then Exit Sub
    Set pdfjob = New PDFCreator.clsPDFCreator
    With pdfjob
    If .cStart(« /NoProcessingAtStartup ») = False Then
    MsgBox « Can’t initialize PDFCreator. », vbCritical + _
    vbOKOnly, « PrtPDFCreator »
    Exit Sub
    End If
    .cOption(« UseAutosave ») = 1
    .cOption(« UseAutosaveDirectory ») = 1
    .cOption(« AutosaveDirectory ») = sPDFPath
    .cOption(« AutosaveFilename ») = sPDFName
    .cOption(« AutosaveFormat ») = 0 ‘ 0 = PDF
    .cClearCache
    End With
    ‘Imprime le document en PDF
    ActiveSheet.PrintOut copies:=1, ActivePrinter:= »PDFCreator »
    ‘Attend que le document soit entré dans la file d’impression
    Do Until pdfjob.cCountOfPrintjobs = 1
    DoEvents
    Loop
    pdfjob.cPrinterStop = False
    ‘Attend que l’impression du document soit terminée
    Do Until pdfjob.cCountOfPrintjobs = 0
    DoEvents
    Loop
    pdfjob.cClose
    Set pdfjob = Nothing
    End Sub

  44. Hervé Inisan dit :

    ES > Dans cet article, le code VBA est supposé tapé dans Excel, il utilise donc directement les objets Excel natifs.

  45. ES dit :

    Comment est ouvert Excel depuis access ?

    Comment est déclaré l’objet « ActiveWorkBook » ? Car il n’existe pas sous access.

    ES

  46. Hervé Inisan dit :

    Em > Est-ce que l’erreur porte sur .cOption ou sur ActiveWorkbook ? Le deuxième peut se produire notamment si tu as fermé ton classeur Excel quelque part dans ton code…

  47. Em dit :

    Bonjour,

    cette source m’est très utile pour mon stage néanmoins le code ne marche pas à chaque fois (si je le lance deux fois d’affilée ça ne marche que la première fois etc…)
    Cela me génère une erreur  » Variable objet ou variable bloc With non définie » à ce niveau là du code :

    .cOption(« AutosaveFilename ») = _
    IIf(strPDFName = «  », ActiveWorkbook.name, strPDFName)

    Si l’un d’entre vous à une idée ? Ah oui et j’utilise ce code mais pilote excel depuis access.

    Bien à vous,

    Em.

  48. Hervé Inisan dit :

    jp > PDFCreator est parfois capricieux sur les notions de timing, il faut parfois jouer sur les temporisations.

    Sinon, au cas où :

    • Les feuilles sont imprimées séparément, l’une après l’autre ?
    • Le problème survient à quel moment ?
  49. jp dit :

    J’ai utilisé ce code pour passer en PDF 15 feuilles d’un fichier excel.

    Problème : le programme reste bloqué sur un message : Microsoft office excel attend la fin de l’exécution d’un action OLE d’une autre application.
    Comment faire ?

  50. Pkayumba dit :

    Merci pour le partage du savoir. L’app me fera gagner du temps!

  51. daisyr dit :

    Ca fait un petit bout de temps que je lit les articles du grnier ACCESS, et je suis vraiment impressionnée par tout ce qui y est proposé!
    Merci beaucoup pour le travail et le partage que vous faites, car personnellement j’y trouve mon bonheur!
    daisyr

  52. rom dit :

    Bonjour,

    Merci pour cette application très très utile qui va faire gagner du temps !!

    Rom

  53. Hervé Inisan dit :

    Julie > Les différentes temporisation sont là pour laisser le temps à PDFCreator de traiter les opérations, il vaut mieux par conséquent les conserver. Mais selon la machine, tu peux éventuellement jouer sur le délai…

  54. Julie dit :

    Bonjour,
    Merci pour cet exemple qui correspond à ce que je recherche.
    Par contre, je ne comprends pas pourquoi il faut utiliser la temporisation, et à quoi cela sert-il?
    Peut-on s’en passer? cela créera-t-il des problèmes?
    Merci!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *