[Catégorie modifiée VB6 --> VBA] Impression de pdf avec excel 2000

Signaler
Messages postés
4
Date d'inscription
lundi 23 juin 2008
Statut
Membre
Dernière intervention
27 août 2010
-
Messages postés
2
Date d'inscription
vendredi 20 août 2010
Statut
Membre
Dernière intervention
15 février 2011
-
Bonjour,
Je dois imprimer plusieur fois la même page en chageant les données à chaque impression ( une macro s'en occupe)
Par contre depuis peu je dois non plus imprimer sur feuille mais dans un fichier pdf.
A chaque nouvelle impression, je dois modifier le nom du fichier pour éviter d'écraser les précédents.
Y a t-il un moyen d'automatiser cette tâche ? Et si Oui avez vous le soltion ?
Merci df'avance

13 réponses

Messages postés
86
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
14 février 2011

j'ai eu aussi à imprimer des pdf avec excel 2003 et j'ai rencotré quelque problèmes.
mais j'ai reussi à trouver une petite fonction.
si tu dispose de PDF creator:


Public Sub SaveToPDF(Chemin As String, nomfichier As String, Feuille As String)
    Dim Temp As Variant
    Temp = Worksheets(Feuille).PrintOut(, , 1, , "PDFCreator", True, True, Chemin + nomfichier + ".ps")

    ' Les Chr(34) sont importants. Ils définissent les guillemets anglais double.
    Shell (Chr(34) + "C:\Program Files\PDFCreator\PDFcreator.exe" + Chr(34) + "-IF" + Chr(34) + Chemin + nomfichier + ".ps" + Chr(34) + "-OF" + Chr(34) + Chemin + nomfichier + ".pdf" + Chr(34))
Application.Wait (Now + TimeValue("0:00:02"))
    Kill Chemin + nomfichier + ".ps"
End Sub


il suffit que tu lui passe en parametres : le chemin ou tu vx generer le pdf, le nom que tu vx lui donner( comme ca pas de soucis pr écraser) et le nom de la feuille du classeur que tu vx imprimer.
NB:
comme tu vois j'ai dû rajouter un
Application.Wait (Now + TimeValue("0:00:02"))

je suis obligé d'attendre parce que le kill peut supprimer le fichier .ps avant que pdfcreator n'ait fini.
si quelque d'autre sait comment eviter le wait je suis egalement preneur

A good excercise for the Heart is to bend down and help another up...
Messages postés
4
Date d'inscription
lundi 23 juin 2008
Statut
Membre
Dernière intervention
27 août 2010

Bonjour Petit Grand Homme
Je vais essayer.
En attendant, je te remercie de ta promptutude. Et si ça marche, tu n'imagines pas à quel point ton aide va me sortir ce la .....panade
Messages postés
86
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
14 février 2011

you are welcom



A good excercise for the Heart is to bend down and help another up...
Messages postés
86
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
14 février 2011

si cela t'a aidé faut cliquer sur reponse accepté pr aider les autres qui en auraient besoin ...

A good excercise for the Heart is to bend down and help another up...
Messages postés
4
Date d'inscription
lundi 23 juin 2008
Statut
Membre
Dernière intervention
27 août 2010

Je n'ai pas PDF Creator mais le fais installer la semaine prochaine. Si le test est concluant je ne manquerai pas t'en aviser. Bien à toi
Messages postés
2
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
1 février 2011

Bonjour little big man
Avant tout merci pour ta contribution, je débute avec un tout petit bagage et j'espère pouvoir à terme renvoyer la balle.
J'ai repris ton code mais j'ai à selectionner un ensemble "variable" d'onglets dénommés dans des cellules et à la convertir dans un unique fichier pdf
Worksheets (feuille) n'admet apparemment pas une liste d'onglets.
J'ai également essayé avec
Sheets(Array(..)).Select
Sheets(...).Activate
Temp = ActiveWindow.SelectedSheets.PrintOut .......
et je n'ai pas trouvé de solution sur le net sauf des usines à gaz.

Si tu as une idée
Et si d'autres ont quelque chose sur le sujet.
Merci.
Messages postés
86
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
14 février 2011

ils sont "dénommés" comment les onglets à imprimer ( un exemple de comment tu les renseigne dans des cellules )

mon idée serait de remplir un tableau avec les noms des feuilles que tu as dans les cellules et de faire une boucle sur ce tableau.

A good excercise for the Heart is to bend down and help another up...
Messages postés
2
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
1 février 2011

Merci pour ta prompte réponse.
les onglets porte un nom du type "dépenses", " budget" , "synthèse". L'objectif est de réaliser de figer chaque fin de mois les états au moyen d'une impression pdf. J'ai donc un bouton qui développe une macro.

Pour le tableau, il y a longtemps que je n'ai pas touché à la programmation (c'est pas mon métier) mais je vais suivre cette piste.

Merci encore et bonne journée.
Messages postés
86
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
14 février 2011

OK. mais je dois avoir un petit code que j'ai trouvé il y a un moment qui pourrait faire ça avec une petite modif. je regarde et je te dis


A good excercise for the Heart is to bend down and help another up...
Messages postés
86
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
14 février 2011

donc donc donc. j'ai retrouvé le code et j'ai un peu modifié pour que ca marche dans ton cas. mais il faudra que fasse deux trois truc quand même. et ne soit pas découragé par la longueur du code il n'y a pas bcp à faire.

premièrement, il va falloir que tu rajoute la réfénce PDFCreator à ton projet. pour cela tu vas dans ton éditeur vba tu clique sur outils=>références et là tu coche PDFcreator.

tu colle ce code sur le bouton ou la macro que tu execute ( en suivant l'exemple pour rajouter le nom des onglets

Private Sub CommandButton1_Click()

OngletsToPrint.Add "budget"
OngletsToPrint.Add "dépenses"
OngletsToPrint.Add "synthèse"
Call ImprimeTousPDF("essai", "C:\Documents and Settings\mondossier")

End Sub


Puis tu colle se code dans un module

    '===============================================================================
    '               SOURCE
    'http://www.hastursoft.com/pdf/generer-un-pdf-par-macro-vba-sous-excel-t23.html
    '===============================================================================
    
    
    Option Explicit
    Public OngletsToPrint As New Collection
    Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
    
       Public Sub ImprimeTousPDF(PDFName As String, PDFLocation As String)
        
          Dim PDFCreator1 As PDFCreator.clsPDFCreator
          Dim DefaultPrinter As String                  ' Imprimante par Défaut (mémorisation)
          Dim c As Long                                 ' compteur Temporisation
          Dim OutputFilename As String                  ' Nom du Fichier Généré
          Dim i As Integer                              ' compteur d'onglets
          Dim x As Variant                              'rajouté par moi ( permet de voir si l'onglet appartient à la liste à imprimer)
          Dim idx As Integer
          Dim nbonglets As Integer
          
          
          nbonglets = OngletsToPrint.Count
         
          Set PDFCreator1 = New clsPDFCreator
          With PDFCreator1
             .cStart "/NoProcessingAtStartup"
             .cOption("UseAutosave") = 1
             .cOption("UseAutosaveDirectory") = 1
             .cOption("AutosaveDirectory") = PDFLocation    ' Répertoire de stockage du Fichier PDF généré
             Debug.Print PDFName                            ' Remplace par des _ les caractères interdits
             .cOption("AutosaveFilename") PDFName         ' Nom de Fichier <nom du Fichier>
             .cOption("AutosaveFormat") 0                 ' 0 PDF
             DefaultPrinter = .cDefaultPrinter              ' Mémorise l'Imprimante pas défaut
             .cDefaultPrinter = "PDFCreator"                ' écrase par PDFCreator
             .cClearCache
          End With
          For i = 1 To Application.Sheets.Count
            For Each x In OngletsToPrint
                If x = Application.Sheets(i).Name Then
                    Application.Sheets(i).PrintOut Copies:=1, ActivePrinter:="PDFCreator"
                    idx = indexOf(x, OngletsToPrint)
                    OngletsToPrint.remove idx
                    Exit For
                End If
            Next
          Next i
          Do Until PDFCreator1.cCountOfPrintjobs = nbonglets       ' Attend la Fin du travail pour quitter
             DoEvents
             Sleep 1000
          Loop
          Sleep 1000
          PDFCreator1.cCombineAll
          Sleep 1000
          PDFCreator1.cPrinterStop = False
       
          c = 0                                                    ' Attend la Fin d'Ecriture
          Do While (PDFCreator1.cOutputFilename = "") And (c < 50) ' au besoin 50x200ms (1 sec)
             c = c + 1
             Sleep 200
          Loop
          OutputFilename = PDFCreator1.cOutputFilename             ' Récupère le nom du Fichier Généré
          With PDFCreator1
             .cDefaultPrinter = DefaultPrinter                     ' Réattribue l'Imprimante initiale
             Sleep 200                                             ' Tempo de prise en compte avant fermeture
             .cClose
          End With
          Sleep 2000                                               ' Tempo 2 sec permettant d'assurer la libération de PDFCreator de la Mémoire
          If OutputFilename = "" Then
             MsgBox "Création Fichier pdf." & vbCrLf & vbCrLf & _
                "Une Erreur s'est produite: Délai dépassé!", vbExclamation + vbSystemModal
          End If
       End Sub


Public Function indexOf(obj As Variant, ByRef col As Collection) As Integer
'retourne l'index de l'objet dans la cpllection
    Dim x As Variant
    Dim i As Integer
    Dim idx As Integer
    i = 1
    For Each x In col
    
        If x = obj Then
            idx = i
            Exit For
        Else
            idx = -1
        End If
        i = i + 1
    Next
    

    indexOf = idx
End Function



et ca devrait être bon. tiens moi au courant

A good excercise for the Heart is to bend down and help another up...
Messages postés
2
Date d'inscription
vendredi 20 août 2010
Statut
Membre
Dernière intervention
15 février 2011

Hello the_little_big_man,
je me suis permis d'utiliser ton cade pour imprimer en PDF un fichier excel: le but est de faire un reporting hebdomadaire automatisé (avec tâche planifiée) sans intervention humaine (ni divine a priori).

je rencontre une petite difficulté: j'ai intégré ton code sous forme d'une fonction. le code créé bien le fichier "lenomquejeveux.ps" et le supprime bien à la fin mais il ne créé pas le fichier au format PDF !

si tu as une idée de ce qui pourrait bloquer ou masquer le fichier, je suis preneur !
si tu as besoin du code, je l'afficherai.

merci d'avance
Messages postés
86
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
14 février 2011

holla CabalusBob.
je présume que tu as utilisé la premiere fonction SaveToPDF ( et permet toi de l'utiliser elle est là pour ça).

le truc c'est que je suppose que ton fichier excel est conséquent et donc quand tu supprimes le .ps il n'a pas encore eu le temps de le convertir en PDF. donc tu peux augment le temps d'attente ( C'est du Bricolage) dans la timevalue(00:00:02) et mettre 05 par exemple. à essayer.

A good excercise for the Heart is to bend down and help another up...
Messages postés
2
Date d'inscription
vendredi 20 août 2010
Statut
Membre
Dernière intervention
15 février 2011

Salut et merci pour ta réponse rapide !
j'avais déja essayé de mettre la tempo à 10 sans succès mais vu ton message, j'ai réessayé à 30sec puis en retirant la commande de suppression du ".ps" mais toujours sans résultat.
pour préciser, je suis sur Win XP SP2 avec Office 2000 donc VB6 (10 ans de retard au boulot )
merci pour ton aide et le temps passé