Création d'un PDF unique avec des impressions multiples

Dessimoz

XLDnaute Nouveau
Bonjour,

J'ai construit à l'aide du forum une macro me permettant d'imprimer différentes feuilles en un seul PDF (en utilisant PDF Creator en annexe à excel).

Pour se faire, j'ai dû installer PDF Creator sur l'ordinateur et introduire sous VBA- outil - Référence - la référence "PDF Creator".

Et ça fonctionne super ! je vais vous donné la macro après, si ça peut aider certain !

LE PROBLEME, car il y en a un gros... c'est que si j'ouvre le fichier sur un poste oÙ pdfcreator n'est pas installé et bien AUCUNE MACRO ne fonctionne. se n'ai pas grave si la macro spécifique à l'impression pdf ne fonctionne pas, mais je ne peux lancer aucune autre macro.

Donc ma question. Y'a t-il un moyen pour que les macros soient fonctionnelles (les macros normales donc) .

En tout cas, merci d'avance pour celui qui pourra me renseigner !

voici le code, ça ressemble pratiquement à ce qui a déjà été proposé, mais c'est modifier, pour une impression conditionnel de différentes pages.


Sub toPDF() 'macro impression (utilité : impression en pdf (nécessite PDF CREATOR) (0.9.8 -avec version 0.9.6 fonctionne pas chez moi)
' NECESSITE AUSSI SOUS VISUAL BASIC - OUTIL - REFERENCE -> Activé PDF Créator

Dim pdfjob As PDFCreator.clsPDFCreator
Dim sPDFName As String
Dim sPDFPath As String
dossier = ThisWorkbook.Path & "\Annexes scannées\" 'pdf ira se placer sous ce dossier
nomclient = ActiveWorkbook.Sheets("situation personnelle").Range("e3").Value 'pdf prendra le nom du fichier client (cf E3 sous situation personnelle)
x16 = Sheets("données pour calcul").Range("x16") 'cellule définissant le nombre de page d'impression des différentes parties (fisc3,...)
x18 = Sheets("données pour calcul").Range("x18") ' '' '' ''
sPDFName = nomclient & ".pdf"
sPDFPath = dossier & 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
.cCombineAll
.cClearCache

End With
'Imprime le document en PDF
pdfjob.cPrinterStop = True
Sheets("page 1").PrintOut copies:=1, ActivePrinter:="PDFCreator"
Do Until pdfjob.cCountOfPrintjobs = 1 'attent que l'impression soit dans la file d'attente de pdf créator
DoEvents
Loop
Sheets("FISC2").PrintOut From:=1, to:=(Sheets("données pour calcul").Range("x14")), copies:=1, ActivePrinter:="PDFCreator"
Do Until pdfjob.cCountOfPrintjobs = 2 'attent que l'impression soit dans la file d'attente de pdf créator
DoEvents
Loop
If x18 > 0 Then
Sheets("fortune et titres").PrintOut From:=(x18), to:=(x18), ActivePrinter:="PDFCreator"
Do Until pdfjob.cCountOfPrintjobs = 3 'attent que l'impression soit dans la file d'attente de pdf créator
DoEvents
Loop
Else 'Si il n'y a pas d'état des titres ça fait ce qui suit, et ça place le compteur de la file d'attente à 3 au lieu de 4 (ce qui permet de continuer la macro)
If x16 = 4 Then
Sheets("FISC2").PrintOut From:=(x16), to:=(x16), copies:=1, ActivePrinter:="PDFCreator"
Do Until pdfjob.cCountOfPrintjobs = 3 'attent que l'impression soit dans la file d'attente de pdf créator
DoEvents
Loop
GoTo Suite::
End If
End If
If x16 = 4 Then
Sheets("FISC2").PrintOut From:=(x16), to:=(x16), copies:=1, ActivePrinter:="PDFCreator"
Do Until pdfjob.cCountOfPrintjobs = 4 'attent que l'impression soit dans la file d'attente de pdf créator
DoEvents
Loop
End If
Suite::
'Attend que le document soit entré dans la file d'impression
'pdfjob.cPrinterStop = False
'Combine all PDFs into a single file and stop the printer
With pdfjob
.cCombineAll
Do Until pdfjob.cCountOfPrintjobs = 1
DoEvents
Loop
.cPrinterStop = False
End With
'Attend que l'impression du document soit terminée
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
pdfjob.cClose
MsgBox "Opération terminée"
'Set pdfjob = Nothing
End Sub
 

Orpheu

XLDnaute Nouveau
Re : Création d'un PDF unique avec des impressions multiples

Bonjour, et merci beaucoup pour cet exemple qui m'a permis de régler un problème pénible que j'avais avec un classeur de 35 pages qui, lorsqu'on l'imprimait en PDF, créait 12 fichiers pour lesquels il fallait à chaque fois saisir un nom, enregistrer, etc...

Je ne sais toujors pas quelles sont les conditions qui font qu'EXCEL fractionne en plusieurs fichiers.... et je suis cioncé pour ceux qui utilisent d'autres imprimantes virtuelles (XPS par exemple) mais pour le coup j'ai contenté un bon nombre d'utilisateurs.

Cependant je te joins une info: Ce n'est pas indispensable de mettre PDFCreator en référence. Au moment du dev ça permet de consulter les membres dans l'explorateur, mais à l'exécution l'ouverture de l'objet les met à disposition même s'ils ne sont pas connus dans ton projet.

As tu essayé, de ton côté ? (je suis d'accord avec toi à 100% sur le problème que ça pose, car si le client n'a pas installé PDFCreator le projet se plante à l'ouverture, lors de la compilation).

En ce qui me concerne, pour savoir si PDFCreator est installé, je me contente de rechercher "PDFCreator" dans la liste des imprimantes...
 

hadeen

XLDnaute Nouveau
Re : Création d'un PDF unique avec des impressions multiples

Bonjour,

J'ai cherché longtemps la manière la plus simple d'imprimer plusieurs feuilles dans un seul pdf. Il s'avère que souvent, on cherche au plus loin quand la réponse est vraiment très simple ^^
J'ai essayé de mettre en place le code proposé, mais, cette méthode ne me plaisait pas beaucoup bien que ce soit la seule que j'ai trouvé en cherchant sur google.

En fait, il suffit de sélectionner plusieurs pages et d'imprimer avec cette commande : ActiveWindow.SelectedSheets.PrintOut

Moi qui voulait que l'impression se fasse via un bouton, je fais la séléction dans le code (mais un ctrl + clic sur la feuille marche aussi)

Voici le code pour imprimer la feuille 1 et 4

Dim Feuille As Worksheet
For Each Feuille In ActiveWorkbook.Sheets
If Feuille.Name <> "Feuil2" And Feuille.Name <> "Feuil3" Then Feuille.Select Replace:=False
Next Feuille


ActiveWindow.SelectedSheets.PrintPreview

ActiveWindow.SelectedSheets.PrintOut copies:=1, Collate:=True


J'espère avoir été utile, comme ce forum a été une grande aide pour moi (je code en vba depuis 3 semaines) je voulais vous partager ma méthode pour imprimer plusieurs feuilles dans un seul pdf :)

Meilleures Salutations,
Hadeen
 

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 313
Membres
102 860
dernier inscrit
fredo67