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).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
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 (facultatif) ' En l'absence de nom de fichier, le PDF ' généré reprend le nom du classeur Excel. ' strDirectory <- Chemin de stockage du fichier PDF (facultatif) ' Public Sub SaveAsPDF( _ Optional ByVal strPDFName As String = "", _ Optional ByVal strDirectory As String = "") ' Quelques variables... Dim pdfc As PDFCreator.clsPDFCreator Dim DefaultPrinter As String Dim c As Long Dim OutputFilename As String ' Instancier un nouvel objet PDFCreator Set pdfc = New clsPDFCreator ' Paramétrer l'objet PDFCreator With pdfc .cStart "/NoProcessingAtStartup" .cOption("UseAutosave") = 1 .cOption("UseAutosaveDirectory") = 1 ' Chemin de destination ' Par défaut : dossier 'Mes documents' de l'utilisateur If strDirectory = "" Then strDirectory = Environ("USERPROFILE") & "Mes documents" End If .cOption("AutosaveDirectory") = strDirectory ' Nom du fichier PDF à générer .cOption("AutosaveFilename") = _ IIf(strPDFName = "", ActiveWorkbook.Name, strPDFName) ' 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 Sub |
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 :
1 2 3 4 5 |
Public Sub Test1() ' Imprimer seulement la feuille en cours Sheets("Feuil1").Select SaveAsPDF "test.pdf" End Sub |
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 :
1 2 3 4 5 |
Public Sub Test2() ' Imprimer les feuilles Feuil1 et Feuil2 Sheets(Array("Feuil1", "Feuil2")).Select SaveAsPDF "test2.pdf" End Sub |
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
PDFCreator a effectivement changé son API, et le VBA de cet article ne fonctionne plus. J’attends qu’ils stabilisent leur nouvelle API pour poster un article compatible 2.2.x.
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.
Ou est mis le second paramètre ?
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.
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.
Juanito > Content que tu aies pu trouver une solution…
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é.
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.
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 ?
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
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ètresstrPDFName
etstrDirectory
.Par contre, si tu recopies l’une des 2 autres macros (
Test1
ouTest2
), elle devrait être visible dans Excel (donc pouvoir être exécutée manuellement ou, plus tard être associée à un bouton).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-dossierCOMWindows 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. 😉
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
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
moy08 > Super, content que ça marche ! 🙂
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.
Kevin > Sur le principe, c’est possible. Il faudrait :
Un peu difficile à préciser dans un commentaire, mais en tout cas, ce serait jouable. 😉
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 !
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
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
moy08 > Quelques réponses :
SaveAsPDF()
. Par exemple :SaveAsPDF "test.pdf", "G:Test"
SaveAsPDF ActiveSheet.Name & " - " & Format(Now, "dd-mm-yyyy") & ".pdf"
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 appelantSaveAsPDF
avec les paramètres qui vont bien. Soit une seule macro pilotantSaveAsPDF
, si les 6 onglets sont imprimés à chaque fois en une opération.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.
Cam > Je n’ai pas de quoi tester le A3 ici, mais quelques pistes quand même :
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
Christophe > Merci pour le retour… et content que ça puisse aider ! 🙂
Bonjour,
Juste un grand remerciement pour ce code. Il correspond exactement à mes besoins avec des explications claires.
Bonne continuation.
GhosT > Qu’est-ce que tu veux dire par : « les pages contenues dans la dernier classeur » ?
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…)
July > L’idée est d’assembler en un PDF les feuilles 1 et 2 ?
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
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 leRedim
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).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 ?
lepotier > Du coup, tu as pu résoudre le problème ?
Hervé> Bonjour Hervé,
Tout à fait ‘:)
Merci pour ta réponse,
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 variableWorkbook
(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.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 😉
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 ».
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
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 :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
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 :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
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.
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
ES > Dans cet article, le code VBA est supposé tapé dans Excel, il utilise donc directement les objets Excel natifs.
Comment est ouvert Excel depuis access ?
Comment est déclaré l’objet « ActiveWorkBook » ? Car il n’existe pas sous access.
ES
Em > Est-ce que l’erreur porte sur
.cOption
ou surActiveWorkbook
? Le deuxième peut se produire notamment si tu as fermé ton classeur Excel quelque part dans ton code…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.
jp > PDFCreator est parfois capricieux sur les notions de timing, il faut parfois jouer sur les temporisations.
Sinon, au cas où :
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 ?
Merci pour le partage du savoir. L’app me fera gagner du temps!
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
Bonjour,
Merci pour cette application très très utile qui va faire gagner du temps !!
Rom
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…
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!