PDFCreator et VBA

mécano41

XLDnaute Accro
Bonjour à tous,

Pour éditer des fiches, j'ai utilisé la méthode suivante :

- dans une feuille, une fiche "modèle" recto + verso est composée de champs avec formules
- les deux zones constituent la zone d'impression
- un cellule (hors zone) reçoit la position de la ligne de la base de données où les formules doivent prendre les éléments pour constituer la fiche ; elle est modifiée par VBA
- le code ci-après (vu sur plusieurs fils ici-même) me permet de créer un fichier .pdf pour chaque fiche

(ce code parce que, si je suis en EXCEL 2010, l'utilisateur est en EXCEL 2003)

Question : si je souhaite envoyer plusieurs fiches (voir les 400) dans le même .pdf, que faut-il ajouter à ce code? (je n'envisage pas de dupliquer le recto-verso en 400 exemplaires)

Code:
Private Sub CommandButton1_Click()
Dim JobPDF As Object
Dim sNomPDF As String
Dim sCheminPDF As String

' ---- Indique le nom du fichier et le chemin du répertoire
sNomPDF = "Essai_" & ".pdf"
sCheminPDF = ThisWorkbook.Path & "\"
' ----- Vérifie si données dans la feuille
If IsEmpty(ActiveSheet.UsedRange) Then Exit Sub
' ----- Transmet les paramètre à PDFCreator
Set JobPDF = CreateObject("PDFCreator.clsPDFCreator")
With JobPDF
    If .cStart("/NoProcessingAtStartup") = False Then
        MsgBox "Initialisation de PDFCreator impossible", vbCritical + vbOKOnly, "PDFCreator"
        Exit Sub
    End If
    .cOption("UseAutosave") = 1
    .cOption("UseAutosaveDirectory") = 1
    .cOption("AutosaveDirectory") = sCheminPDF
    .cOption("AutosaveFilename") = sNomPDF
    .cOption("AutosaveFormat") = 0                     ' Type de fichier : 0=PDF, 1=Png, 2=jpg, 3=bmp, 4=pcx, 5=tif, 6=ps, 7=eps, 8=txt
    .cClearCache
End With
' ---- Indique le nombres de copies et l'imprimante virtuelle - Impression
ActiveWorkbook.PrintOut copies:=1, ActivePrinter:="PDFCreator"
' ----- Fichier dans la file d'attente
Do Until JobPDF.cCountOfPrintjobs = 1
    DoEvents
Loop
JobPDF.cPrinterStop = False
' ----- Attendre que la file d'attente soit vide
Do Until JobPDF.cCountOfPrintjobs = 0
    DoEvents
Loop
Application.Wait Now + TimeValue("00:00:03")
JobPDF.cClose
Set JobPDF = Nothing
End Sub


Merci d'avance,

Cordialement
 
Dernière édition:

mécano41

XLDnaute Accro
Re : PDFCreator et VBA

Bonsoir,

Dans mon appli. je vais peut-être laisser deux possibilités :

- soit mettre dans un répertoire, 400 fichiers de 2 pages (1 recto et 1 verso). Dans ce cas, chaque fichier portera un nom générique + le N° matricule de la fiche

- soit sortir A seul fichier comportant 800 pages (400 recto et 400 verso) et dans ce cas, un seul nom.

Je ne suis pas sûr que la seconde solution soit intéressante même en utilisant un de tes codes qui semble pouvoir extraire un PDF d'un ensemble, il faudra voir comment le repérer parmi les autres. Il faudra une table de concordance entre le rang et le matricule...C'est à discuter avec l'utilisateur...

Pour ce que je voulais faire, j'y suis arrivé avec le code suivant :

Code:
' =========================================================================================================================
'                                                                                         Impression dans un fichier avec PDFCreator
'                                                                           Code récupéré - Indiqué dans plusieurs fils sur XLDownLoads
' =========================================================================================================================
Sub SortiePdfCreator(FeuilAimpr As Worksheet, sNomPDF As String, sCheminPDF As String, NbCop As Long)
' NomPDF = Nom du fichier à enregistrer avec extension
' sCheminPDF= chemin du répertoire (ex. : ThisWorkbook.Path & "\")
' NbCop = Nombre de copies
' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Dim JobPDF As Object
Dim CptFich

' ----- Vérifie si données dans la feuille
If IsEmpty(ActiveSheet.UsedRange) Then Exit Sub
' ----- Transmet les paramètre à PDFCreator
Set JobPDF = CreateObject("PDFCreator.clsPDFCreator")
With JobPDF
    If .cStart("/NoProcessingAtStartup") = False Then
        MsgBox "Initialisation de PDFCreator impossible", vbCritical + vbOKOnly, "PDFCreator"
        Exit Sub
    End If
    .cOption("UseAutosave") = 1
    .cOption("UseAutosaveDirectory") = 1
    .cOption("AutosaveDirectory") = sCheminPDF
    .cOption("AutosaveFilename") = sNomPDF
    .cOption("AutosaveFormat") = 0                             ' 0 = type .pdf
    .cClearCache
End With
' ---- Indique le nombres de copies et nom de l'imprimante virtuelle - Impression
For CptFich = 1 To 5 '######### 5 = Nb provisoire pour essai ####### ici, ce sera le nombre de paires de pages à sortir (env. 400)
    F7.Range("LigBas").Value = CptFich
    FeuilAimpr.PrintOut From:=1, To:=2, copies:=NbCop, ActivePrinter:="PDFCreator"
    ' ----- Fichier dans la file d'attente
    Do Until JobPDF.cCountOfPrintjobs = CptFich
        DoEvents
    Loop
Next CptFich
' ----- Combine les PDFs en un fichier unique et arrête l'impression
With JobPDF
    .cCombineAll
    Do Until .cCountOfPrintjobs = 1
        DoEvents
    Loop
    .cPrinterStop = False
    ' -----Attend que l'impression du document soit terminée
    Do Until .cCountOfPrintjobs = 0
        DoEvents
    Loop
    .cClose
End With
MsgBox "Opération terminée"
Set pdfjob = Nothing
End Sub

Cela fonctionne parfaitement avec 5 paires de pages, mais si tu peux me dire s'il y a quelques maladresses ou des choses en trop (ou en manque) ne te gêne pas!

Il manque une sécurité : vérifier si le fichier que l'on veut créer n'existe pas déjà.

Merci...

Cordialement
 

kiki29

XLDnaute Barbatruc
Re : PDFCreator et VBA

re, brut de fonderie, à tester
ici pas de cCombineAll, on crée une liste récursive ou non des fichiers pdf d'un dossier, puis on les fusionne dans l'ordre de cette liste
 

Pièces jointes

  • Liste Fusion PDF 01.xls
    68 KB · Affichages: 155
Dernière édition:

mécano41

XLDnaute Accro
Re : PDFCreator et VBA

Bonjour,

Dans le code de mon message #7, à la ligne :

Code:
    FeuilAimpr.PrintOut From:=1, To:=2, copies:=NbCop, ActivePrinter:="PDFCreator"

j'ai l'apparition furtive d'une boîte de dialogue indiquant "Impression de la page 1/2 ....etc" à chaque passage de la boucle.

J'ai mis Application.DisplayAlerts = False avant mais cela ne change rien. Comment-puis-je faire pour éviter ce message?

Merci d'avance

Cordialement
 

mécano41

XLDnaute Accro
Re : PDFCreator et VBA

Bonjour Kiki29,

J'ai adapté et utilisé tes codes pour Créer un PDF et Fusionner des PDF et tout fonctionnait bien depuis plusieurs jours, sauf que je viens d'avoir un gros problème....

c'est dans ce code :

Code:
' ===============================================================
' Impression dans un fichier avec PDFCreator
' Code récupéré - Indiqué dans plusieurs fils Kiki29 sur XLDownLoads et Developpez.com
' ===============================================================
Sub SortieUniquePdfCreator(FeuilAimpr As Worksheet, sNomPDF As String, sCheminPDF As String, NbCop As Long)
' sNomPDF = Nom du fichier à enregistrer avec extension
' sCheminPDF= chemin du répertoire (ex. : ThisWorkbook.Path & "\")
' NbCop = Nombre de copies

Dim JobPDF As Object
Dim CptFich
If IsEmpty(FeuilAimpr.UsedRange) Then Exit Sub
Set JobPDF = CreateObject("PDFCreator.clsPDFCreator")
With JobPDF
    If .cStart("/NoProcessingAtStartup") = False Then
        MsgBox "Initialisation de PDFCreator impossible", vbCritical + vbOKOnly, "PDFCreator"
        Set JobPDF = Nothing
        Exit Sub
    End If
    .cOption("UseAutosave") = 1
    .cOption("UseAutosaveDirectory") = 1
    .cOption("AutosaveDirectory") = sCheminPDF
    .cOption("AutosaveFilename") = sNomPDF
    .cOption("AutosaveFormat") = 0
    .cClearCache
    FeuilAimpr.PrintOut From:=1, To:=2, copies:=NbCop, ActivePrinter:="PDFCreator"
     Do Until JobPDF.cCountOfPrintjobs = 1
         DoEvents
     Loop
    .cPrinterStop = False
    Do Until .cCountOfPrintjobs = 0
        DoEvents
    Loop
    .cClose
End With
Set JobPDF = Nothing
End Sub

A un moment donné, Adobe m'a dévié vers son site, m'invitant à une mise à jour de PDFCreator, que j'ai refusée me réservant de la faire plus tard. Depuis, plus possible de travailler avec PDFCreator. Cela passe toujours par MsgBox "Initialisation de PDFCreator impossible".

Cela me l'avait fait une ou deux fois suite à des erreurs lors de la mise au point mais je m'en sortais en redémarrant l'ordi. (fermer/ouvrir EXCEL ne suffisait pas). Là, rien n'y fait ; j'ai désinstallé/réinstallé PDFCreator au cas où...pas de changement, d'autre fichiers antérieurs utilisant ce code ne fonctionnent plus non plus dans cette partie. Mon code utilise aussi ta procédure de vérification si PDFCreator existe : on passe sans problème et un listage VBA des imprimantes connectées le donne bien présent...et si je court-circuite le if/end if, j'ai une erreur 1004 à la ligne
Code:
FeuilAimpr.PrintOut From:=1, To:=2, copies:=NbCop, ActivePrinter:="PDFCreator"

Que faire (fonctionnant sous EXCEL 2003)...?

Merci d'avance.

Cordialement
 

mécano41

XLDnaute Accro
Re : PDFCreator et VBA

Bonsoir,

J'ai quand même eu sa peau! Tout fonctionne à nouveau. Cela ne venait pas directement de ce code mais de quelque chose dans sa feuille de module et/ou dans la feuille à transformer en PDF. J'ai pourtant vérifié de nombreuses fois les noms de répertoire, de s/s répertoire et de fichier qui étaient composés ailleurs : tout était correct...alors peut-être des caractères de contrôle insérés au moment du plantage... J'ai finalement refait la feuille à convertir et recopié par morceaux le code d'un ancien fichier et de fichiers d'essais qui fonctionnaient, dans un nouveau module, mais je n'ai pas trouvé d'où venait exactement le problème...

Ce que j'aimerais surtout savoir c'est pourquoi comment un plantage a pu faire une destruction définitive de quelque chose qui demandait ensuite un redémarrage du PC pour pouvoir réutiliser PDFCreator avec un autre fichier, celui en cause étant inutilisable avant d'effectuer les actions ci-dessus!

Si quelqu'un a une idée pour éviter cela en cas de nouveau plantage...(sur une nouvelle demande de mise à jour par ex., comme cette fois-ci!) je lui en saurai gré...

Cordialement
 

Discussions similaires

Réponses
8
Affichages
632
Réponses
5
Affichages
335