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

VBScript Discussion :

Convertir un .xls en .pdf sans intervention


Sujet :

VBScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Par défaut Convertir un .xls en .pdf sans intervention
    Bonjour,

    Cela fait plusieurs heures que je cherche en vain une réponse à ma question alors je me décide à poster içi.

    Je travaille en entreprise et nous avons une application métier qui génère des fichiers .xls tous les matins.

    Mon objectif est de convertir certains de ces fichiers en .pdf automatiquement (sans aucune intervention de ma part car le traitement aura lieu très tôt le matin).

    J'ai PDFCreator et CutePDF mais je pense que PDFCreator répond mieux au besoin d'automatisation que je rencontre.

    J'ai récupéré un code sur Internet qui permet de faire ça mais uniquement si le fichier .xls est ouvert et que le focus est sur la feuille que l'on veut imprimer.

    J'ai donc essayé d'adapter ce code pour qu'il aille chercher les fichiers .xls dans un dossier et qu'ils les impriment en .pdf tout seul comme un grand mais je n'ai abouti à rien.

    Pourriez-vous m'aider svp ?

    Merci d'avance pour vos réponses


    Voici le code que j'ai récupéré :

    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
     sNomPDF = "Essai.pdf"
        sNomXLS = "Test.xls"
        sCheminPDF = "c:\"
     
        'If IsEmpty(ActiveSheet.UsedRange) Then Exit Sub
     
        Set jobPDF = CreateObject("PDFCreator.clsPDFCreator")
     
        With jobPDF
            If .cStart("/NoProcessingAtStartup") = False Then
                MsgBox "Initialisation de PDFCreator impossible", vbCritical + vbOKOnly, "PDFCreator"
            End If
            .cOption("UseAutosave") = 1
            .cOption("UseAutosaveDirectory") = 1
            .cOption("AutosaveDirectory") = sCheminPDF
            .cOption("AutosaveFilename") = sNomPDF
     
            '0=PDF, 1=Png, 2=jpg, 3=bmp, 4=pcx, 5=tif, 6=ps, 7=eps, 8=txt
            .cOption("AutosaveFormat") = 0
            .cClearCache
        End With
     
        ActiveWindow.SelectedSheets.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
        jobPDF.cClose
        Set jobPDF = Nothing

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 303
    Par défaut
    bonjour,
    excel est-il également installé sur la machine sur laquelle sera lancé le script ?
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Par défaut
    Bonjour,

    Oui, Excel est bien installé sur le poste qui fera le traitement.

  4. #4
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 303
    Par défaut
    alors il suffit de piloter excel comme serveur com, définir la variable objet activewindow qui est utilisée dans ton exemple et ça roulera tout seul
    exemples de pilotage
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Par défaut
    Merci pour ta réponse omen999.

    J'ai regardé l'exemple que tu m'a fournis mais peux-tu me dire ce que je dois changer sur mon code et surtout, est-ce que je dois installer quelque chose pour gérer les ActiveX ?

  6. #6
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 303
    Par défaut
    peux-tu me dire ce que je dois changer sur mon code
    tu dois ajouter le code qui va définir la variable objet activewindow en t'inspirant des exemples donnés
    est-ce que je dois installer quelque chose pour gérer les ActiveX ?
    rien du tout, la fonction createobject sert justement à créer des objets activex utilisables dans un script
    si excel a été correctement installé, il se sera référencé tout seul comme un grand dans la base de registres et
    un objet excel pourra être instancié via ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oExcel = CreateObject("Excel.Application")
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Par défaut
    Je ne vois pas ce que tu veux dire par "le code qui va définir la variable objet ActiveWindow".

    Je débute en vbs (tu l'as surement déjà remarqué ).

    Aurais-tu un exemple (il ne parle pas spécifiquement de l'objet activewindow sur le lien que tu as posté).

    Autres questions : Cette solution implique t-elle qu'Excel va s'ouvrir un moment ou un autre ?

    Si je veux imprimer automatiquement un .xls en .pdf, dans tous les cas, Excel devra s'ouvrir à un moment donné ?

    Merci pour ton aide en tous cas.

  8. #8
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 303
    Par défaut
    je n'ai pas en tête le modèle objet précis d'excel que tu trouveras ici
    en gros tu crées l'objet application, tu charges le fichier xls (l'exemple est donné dans le lien de mon précédent message)
    tu définis l'objet activewindow qui est une propriété de l'objet application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ActiveWindow = oExcel.ActiveWindow
    Cette solution implique t-elle qu'Excel va s'ouvrir un moment ou un autre ?
    a priori, quand excel est lancé en mode automation, il n'est pas visible, au pire un
    devrait résoudre le problème
    mais cette ligne de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWindow.SelectedSheets.PrintOut copies:=1, ActivePrinter:="PDFCreator"
    commande l'impression des feuilles sélectionnées
    je ne sais pas si cette sélection est automatique quand on ouvre un fichier xls
    (je n'utilise jamais excel)
    bonne chance
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Par défaut
    Mille Merci !

    Je devrais pouvoir me débrouiller avec tout ça.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Par défaut
    Bonjour,

    J'ai avancé un peu dans le code, à priori il devrait tourner mais j'ai un problème avec cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWindow.SelectedSheets.PrintOut copies:=1, ActivePrinter:="PDFCreator"
    Quand je lance le .vbs, j'ai systématiquement une erreur sur cette ligne : Instruction attendue.

    Voici le code complet si ça peut aider :

    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
    Set objExcel = CreateObject("Excel.Application")
    Set objWorkbook = objExcel.Workbooks.Open("C:\blabla.xls")
    Set ActiveWindow = objExcel.ActiveWindow
    Application.ActivePrinter = "PDFCreator"
    objExcel.Visible = False
     
     
        sNomPDF = "Essai.pdf"
        sCheminPDF = "c:\"
     
        Set jobPDF = CreateObject("PDFCreator.clsPDFCreator")
     
        With jobPDF
            If .cStart("/NoProcessingAtStartup") = False Then
                MsgBox "Initialisation de PDFCreator impossible", vbCritical + vbOKOnly, "PDFCreator"
            End If
            .cOption("UseAutosave") = 1
            .cOption("UseAutosaveDirectory") = 1
            .cOption("AutosaveDirectory") = sCheminPDF
            .cOption("AutosaveFilename") = sNomPDF
            .cOption("AutosaveFormat") = 0
            .cClearCache
        End With
     
        ActiveWindow.SelectedSheets.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
        jobPDF.cClose
        Set jobPDF = Nothing

    Un dernier petit coup de main svp

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Par défaut
    Je pense que l'erreur vient des := de la ligne .

    Quand je retire les : il me dit que le chiffre doit être compris entre 1 et et 32767 et quand je laisse := il me dit qu'une instruction est attendue.

    Sachant que ce code est normalement utilisé directement dans une feuille Excel en VBA, le problème ne vient-il pas du fait que dans mon cas c'est un VBS et que la syntaxe n'est pas exactement la même ?

    Merci de votre aide.

  12. #12
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 303
    Par défaut
    déjà remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ActivePrinter = "PDFCreator"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objExcel.ActivePrinter = "PDFCreator"
    ensuite la syntaxe de la méthode PrintOut est ici
    au pifomètre, je mettrais quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWindow.PrintOut True, False
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Par défaut
    Merci pour ta réponse,

    En effet plus d'erreur de syntaxe par contre il m'ouvre des processus Excel à l'infini.

    Juste avant que tu postes ta réponse, je venais juste de trouver une solution sur ce forum.

    Voici la syntaxe que ce code propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objWorkbook.Sheets(1).Printout ,,,,"PDFCreator"
    Et ça marche nickel !

    Voici mon code final pour ceux que ça intéresse :

    Il devrait marcher si vous avez PDFCreator et un fichier blabla.xls dans le répertoire C:\


    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
    Set objExcel = CreateObject("Excel.Application")
    Set objWorkbook = objExcel.Workbooks.Open("c:\blabla.xls")
    objExcel.Visible = False
     
    objExcel.ActivePrinter = "PDFCreator"
        sNomPDF = "Essai.pdf"
        sCheminPDF = "c:\"
     
        Set jobPDF = CreateObject("PDFCreator.clsPDFCreator")
     
        With jobPDF
            If .cStart("/NoProcessingAtStartup") = False Then
                MsgBox "Initialisation de PDFCreator impossible", vbCritical + vbOKOnly, "PDFCreator"
            End If
            .cOption("UseAutosave") = 1
            .cOption("UseAutosaveDirectory") = 1
            .cOption("AutosaveDirectory") = sCheminPDF
            .cOption("AutosaveFilename") = sNomPDF
            .cOption("AutosaveFormat") = 0
            .cClearCache
     
        End With
     
        objWorkbook.Sheets(1).Printout ,,,,"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
        jobPDF.cClose
        Set jobPDF = Nothing

    Merci beaucoup Omen999 pour ton aide tout au long de mes recherches.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/11/2011, 10h10
  2. Convertir fichier .xls en .pdf
    Par Niiin dans le forum C++
    Réponses: 5
    Dernier message: 08/03/2011, 01h22
  3. Convertir des .xls en .pdf
    Par Opera140 dans le forum Delphi
    Réponses: 10
    Dernier message: 04/04/2007, 12h36
  4. Convertir des .xls en .pdf
    Par Opera140 dans le forum Documents
    Réponses: 2
    Dernier message: 19/03/2007, 22h31
  5. impression PDF sans intervention de l'utilisateur
    Par jdelges dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/03/2007, 16h19

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