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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é
    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 !!

  8. #8
    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.

  9. #9
    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+

  10. #10
    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é.

  11. #11
    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

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