IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Bug PDFJob.cClose - PDFCreator ne s'arrête plus


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    220
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 220
    Par défaut Bug PDFJob.cClose - PDFCreator ne s'arrête plus
    Bonjour à tous,

    J'ai mis une macro en place, il y a quelques temps, qui transforme entre autres une trentaine de classeurs Excel en PDF (partie trouvée sur Internet) avec PDFCreator. Tout fonctionnait parfaitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Set ClasseurTemp = ActiveWorkbook
            
            sPDFName = Left(ClasseurTemp.Name, Len(ClasseurTemp.Name) - 4)
            sPDFPath = ClasseurTemp.Path & Application.PathSeparator
    
            
            Set PDFJob = CreateObject("PDFCreator.clsPDFCreator")
            
            If PDFJob.cStart("/NoProcessingAtStartup") = False Then
                MsgBox "Can not initialize PDFCreator.", vbCritical + vbOKOnly, "Error!"
                Exit Sub
            End If
            
            With PDFJob
                .cOption("UseAutosave") = 1
                .cOption("UseAutosaveDirectory") = 1
                .cOption("AutosaveDirectory") = sPDFPath
                .cOption("AutosaveFilename") = sPDFName
                .cOption("AutosaveFormat") = 0
     
                'Pour une sécutité minimale
                .cOption("PDFUseSecurity") = 1
                .cOption("PDFOwnerPass") = 1
                .cOption("PDFOwnerPasswordString") = sPswdPrincipal
     
                'Options de sécurité
                .cOption("PDFDisallowCopy") = 1
                .cOption("PDFDisallowModifyContents") = 1
                .cOption("PDFDisallowPrinting") = 0
     
                'Pour forcer l'utilisateur à saisir un mot de passe
                .cOption("PDFUserPass") = 1
                .cOption("PDFUserPasswordString") = sPswdUtilsateur
     
                'Cryptage élevé
                .cOption("PDFHighEncryption") = 1
            End With
            
            'Print the document to PDF
            lTtlSheets = Application.Sheets.count
            For lSheet = 1 To Application.Sheets.count
                On Error Resume Next 'To deal with chart sheets
                If Not IsEmpty(Application.Sheets(lSheet).UsedRange) Then
                    Application.Sheets(lSheet).PrintOut copies:=1, ActivePrinter:="PDFCreator"
                Else
                    lTtlSheets = lTtlSheets - 1
                End If
                On Error GoTo 0
            Next lSheet
        
            'Wait until all print jobs have entered the print queue
            Do Until PDFJob.cCountOfPrintjobs = lTtlSheets
                DoEvents
            Loop
        
            'Combine all PDFs into a single file and stop the printer
            With PDFJob
                .cCombineAll
                .cPrinterStop = False
            End With
        
            'Wait until PDF creator is finished then release the objects
            Do Until PDFJob.cCountOfPrintjobs = 0
                DoEvents
            Loop
            PDFJob.cClose
            Set PDFJob = Nothing
    Il y a quelques jours, mon ordinateur est repassé par le service informatique et depuis, la macro bloque. J'obtiens dès le 1er classeur le message d'erreur "Microsoft Office Excel is waiting for another application to complete an OLE action" et je dois fermer PDFCreator manuellement via le Task Manager pour débugger la lecture. La ligne concernée est PDFJob.cClose.

    Quelqu'un a-t-il une idée ? Y a-t-il quelque chose à activer ? à cocher ?

    Merci beaucoup d'avance.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si c'est bien cClose et non Close tout court je ne vois pas. Mais je simplifierais tout de même le code pour cette partie là (même si la syntaxe que tu as fonctionne ou "a eu fonctionné")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
            'Print the document to PDF
            lTtlSheets = Application.Sheets.count
            For lSheet = 1 To Application.Sheets.count
                On Error Resume Next 'To deal with chart sheets
                If Not IsEmpty(Application.Sheets(lSheet).UsedRange) Then
                    Application.Sheets(lSheet).PrintOut copies:=1, ActivePrinter:="PDFCreator"
                Else
                    lTtlSheets = lTtlSheets - 1
                End If
                On Error GoTo 0
            Next lSheet
     
            'Wait until all print jobs have entered the print queue
            Do Until PDFJob.cCountOfPrintjobs = lTtlSheets
                DoEvents
            Loop
    Il est plus logique de donner au système le temps de traiter chaque feuille plutôt que celui de traiter toutes les feuilles à la fois. Ceci en intégrant le DoEvents dans la boucle d'impression. En outre, si tu crées une instance des feuilles, ton code est simplifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim A_sheet As Worksheet
            'Print the document to PDF
            For Each A_sheet In Application.Sheets
                On Error Resume Next 'To deal with chart sheets
                If Not IsEmpty(A_sheet.UsedRange) Then
                    A_sheet.PrintOut copies:=1, ActivePrinter:="PDFCreator"
                    DoEvents
                End If
                On Error GoTo 0
            Next
    Une question : Que fais-tu des feuilles de graphiques ?

  3. #3
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Salut,

    j'ai le même problème que toi, as-tu trouvé une solution ou pas ?

    Merci.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par WebPac
    j'ai le même problème que toi...
    C'est à dire ?

  5. #5
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Bonjour,

    à l'appel de la méthode cClose, le processus PDFCreator.exe monte à 100% du CPU et ne s'arrête plus, le programme qui l'appelle est figé.
    Il faut killer le processus PDFCreator pour continuer.

    J'ai trouvé une solution vraiment "pas propre", c'est de mettre une pause avant d'appeler la méthode cClose.

    Cette solution est loin d'être une bonne solution car ça rallonge beaucoup les temps de traitement (2 secondes de pause x 30 itérations), cette pause est rarement utile, en fait, elle n'est utile que si la méthode bloquait sans la pause, mais comme on ne peut pas le savoir à priori, on est obligé de la faire.
    Et le plus gros problème est que cette pause dépend des ressources et de la rapidité de la machine, sur mon poste, avec une pause de 2 secondes, cela suffit, par contre, chez un utilisateur, il faut la monter à 5 secondes minimum.
    Cela signifie qu'elle ne peut pas être écrite en dur dans le code comme étant une constante mais doit être configurable par l'utilisateur, et il est difficile d'expliquer à quoi elle sert à l'utilisateur final.

    Donc, s'il y a une solution propre qui répare le problème, je prends de suite.

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Est-ce que tu rétablis l'imprimante par défaut après avoir fait appel à PDFCreator ?

  7. #7
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Est-ce que tu rétablis l'imprimante par défaut après avoir fait appel à PDFCreator ?
    Oui monsieur, en fait, le même code fonctionne quand on met une pause et ne fonctionne plus quand on retire cette pause.

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as une méthode pour tuer un processus qui t'embête. C'est dans la FAQ Access et pour le trouver avec un mot clé il faut parler anglais. Ceci dit, si tu ne connais pas l'anglais, alors regarde .

    Edit
    En fait, tu utilises la méthode pour tester la fermeture de PDFCreator avant de poursuivre l'exécution de la macro (faut lui laisser le temps d'enregistrer le fichier et de se fermer)

    Lis bien tout

  9. #9
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Salut,
    en fait, l'idée est d'attendre 5 secondes par exemple, voir si le processus s'est bien fermé et s'il ne s'est pas fermé seul, le killer ?

    Ce n'est pas une solution très très propre et cela impose aussi de faire une pause avant de vérifier si le processus s'est fermé, mais ça a le gros avantage de savoir quand ça va buguer et donc on peut faire plus de tests pour comprendre pourquoi ça plante.

    Avant de mettre cette solution en place, je vais faire quelques tests dans cette voie.

    Merci pour l'idée.

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    En fait, en un second temps, je proposais d'utiliser la méthode testant l'existence du processus - dans une boucle Do While - afin d'attendre son arrêt avant de continuer la macro.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut
    Salut,
    Je ne sais pas si ça peut vous aider, j'ai eu le meme genre de probleme avec ecxel. Une macro je ne sais pas pourquoi me mettait la panique dans mon prog, deconnection blocage. J' ai résolu l'inconvénient en enregistrant une nouvelle macro aussitot arretee, Puis j'ai transferer la totalite des codes de la macro concernée, dedans la nouvelle, changer de nom, effacer la madmacro. Et ça refonctionne. Pourquoi, mais parce que. Si vous faites cela sauvegarder votre prog sous un autre nom, par precaution, et si vous avez un thisworkbook actif modifier le s'il lance ce nouveau prog, avant de redemarrer. Si ça peut fonctionner..... parce que là j'ai galerer...Rame, rameur ramez !!

  12. #12
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Salut,

    @ ouskel'n'or : en fait, ça ne fonctionne pas.
    En effet, le processus ne s'arrête pas avant l'appel de cClose, mais c'est bien cClose qui arrête le processus, donc faire un test si le processus s'est arrêté avant d'appeler cClose n'a pas de sens.
    Et faire une boucle après l'appel de cClose ne fonctionne pas non plus vu que le programme attend que cClose soit terminé pour passer à l'instruction suivante.
    Dommage, dommage, retour à la case départ.

    @ CRACOS38 : le problème n'est pas en VBA car on pilote PDFCreator en Automation, en fait, je ne programme pas en VBA mais en Delphi, mais le pilotage de PDF Creator est le même, en fait, je cherchais sur le net des gens qui avaient eu le même problème de blocage avec PDF Creator et on en retrouve quelques uns et ils utilisent des langages de programmation différents.
    Le problème est qu'on dirait qu'il n'y a pas de solution, enfin personne n'a posté LA solution à ce problème de blocage qui, on dirait date de quelques temps vu qu'il avait déjà été remonté en 0.9.3.

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Veux-tu dire que la procédure se bloque sur cClose ? Je ne pense pas... Donc, je reprends mon idée : vérifier, après cClose, dans une boucle, l'existence du processus. On sort de la boucle dès que le processus n'existe plus et on passe à l'instruction suivante. L'attente, au lieu d'être fixée en dur, dépend de l'exécution de cClose.
    Maintenant, comme je ne suis pas en mesure de le tester... peut-être l'idée ne paraît être jolie... que de loin
    Tiens-nous au courant si tu trouves quelque chose
    A+

  14. #14
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Veux-tu dire que la procédure se bloque sur cClose ? Je ne pense pas... Donc, je reprends mon idée : vérifier, après cClose, dans une boucle, l'existence du processus. On sort de la boucle dès que le processus n'existe plus et on passe à l'instruction suivante. L'attente, au lieu d'être fixée en dur, dépend de l'exécution de cClose.
    Maintenant, comme je ne suis pas en mesure de le tester... peut-être l'idée ne paraît être jolie... que de loin
    Tiens-nous au courant si tu trouves quelque chose
    A+
    Désolé de te contredire mais c'est bien la procédure cClose qui se bloque.
    Enfin c'est PDFCreator qui bloque et ne rend pas la main au programme, donc on ne passe pas à l'instruction suivante tant que le processus n'est pas killé.

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ok, je m'arrête là. Imaginer des solutions improbables sur des hypothèses fausses est le meilleur moyen d'arriver à une solution douteuse...
    Bon courage

  16. #16
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    C'est pas grave, en fait, je crois qu'il n'y a pas de bonne solution, sinon, on pourrait la trouver sur internet.

  17. #17
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    220
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 220
    Par défaut
    Hello à tous.
    Je vois que vous avez potassé depuis le temps pendant que moi j'avais laissé tomber. J'avais laissé de côté mon souci parce que je mettais une pause de 5 secondes avant et après la procédure cClose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Application.Wait (Now + TimeValue("0:00:05"))
     
    PDFJob.cClose
     
    Application.Wait (Now + TimeValue("0:00:05"))
    Effectivement, avec mon pc, une pause de 2 seconde suffit, mais comme tous les pc n'ont pas la même puissance, j'ai dû fixer à 5 secondes, encore que sur certains ca bug encore. Ca rallonge énormément la durée d'exécution de la macro (j'ai une 50aine de pdf à créer) mais c'est la seule solution que j'ai pu trouver.
    Et c'est bien sur cClose que ca bug.

  18. #18
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    J'ai trouvé une autre solution qui fonctionne pas mal.

    Je ne crée pas une instance PDF pour chaque impression et ne ferme pas PDF pour chaque impression, mais j'en crée une au départ que je réutilise pour chaque impression et que je ferme à la fin donc 1x et ça fonctionne bien.

    Plus besoin de pauses à rallonge car avec l'autre solution, l'utilisateur final en était rendu à plus d'une minute de pause et ça posait encore problème.

  19. #19
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, perso je passe par cela car effectivement, certaines fois et pas toujours un process PDFCreator reste actif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub KillPDFCreator()
    Dim RetVal As Long
        '   Parametres Taskkill
        '   http://technet.microsoft.com/en-us/library/bb491009.aspx
        RetVal = Shell("Taskkill /im PDFCreator.exe /f", 0)
       Application.Wait Now + TimeValue("00:00:02")
    End Sub

  20. #20
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    220
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 220
    Par défaut
    Citation Envoyé par WebPac Voir le message
    J'ai trouvé une autre solution qui fonctionne pas mal.

    Je ne crée pas une instance PDF pour chaque impression et ne ferme pas PDF pour chaque impression, mais j'en crée une au départ que je réutilise pour chaque impression et que je ferme à la fin donc 1x et ça fonctionne bien.

    Plus besoin de pauses à rallonge car avec l'autre solution, l'utilisateur final en était rendu à plus d'une minute de pause et ça posait encore problème.
    Salut Webpac
    tu peux mettre ton code stp que je vois comment améliorer le mien du coup
    Merci !

Discussions similaires

  1. Problème impression qui ne s'arrête plus
    Par hduboue dans le forum AS/400
    Réponses: 9
    Dernier message: 17/03/2015, 18h14
  2. [problèmes] PC qui ne s'arrête plus
    Par leprov dans le forum Ordinateurs
    Réponses: 2
    Dernier message: 20/08/2007, 17h12
  3. Réponses: 4
    Dernier message: 23/08/2006, 14h48
  4. pc qui ne s'arrête plus
    Par Blo0d4x3 dans le forum Windows Serveur
    Réponses: 18
    Dernier message: 05/05/2006, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo