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 :

Convertir en PDF sans ouvrir le fichier [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut Convertir en PDF sans ouvrir le fichier
    Bonjour le forum,

    J'ai un dossier contenant pas loin de 800 fichiers (.xls, .xlsx, .xlsm) que je dois convertir en pdf.
    Mon problème est que, même si ces fichiers ne sont pas très lourds, ils sont remplis d'images et de formes, et cela ralentit énormément leur ouverture.

    J'ai fait un test avec le code suivant et un dossier qui ne comprenait qu'un fichier Excel.

    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
    Sub BoucleEtConversionPDF()
    Dim strChemin As String, strFichier As String, strTitre As String, strCheminPDF
     
    t0 = Timer
     
    strChemin = ""
    strFichier = ""
    strTitre = ""
     
    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With
     
    strChemin = "blablabla"
    strCheminPDF = "blablabla"
    strFichier = Dir(strChemin & "*.*")
     
    Do While Len(strFichier) > 0
        Workbooks.Open Filename:=strChemin & strFichier, UpdateLinks:=False
        strTitre = Left(strFichier, InStr(1, strFichier, ".", vbTextCompare) - 1)
     
        Application.Calculation = xlCalculationManual
        Workbooks(strFichier).ExportAsFixedFormat xlTypePDF, strCheminPDF & strTitre
        Application.Calculation = xlCalculationAutomatic
     
        Workbooks(strFichier).Close False
        strFichier = Dir()
    Loop
     
    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .EnableEvents = True
    End With
     
    T1 = Timer
    Debug.Print "Exécution Exportation : " & Format(T1 - t0, "0.000") & " s"
    End Sub
    Résultat, deux minutes pour la conversion d'un seul fichier. Si je calcule bien, ça veut dire que la conversion des mes 800 fichiers prendrait plus de 26h...
    Alors je me demandais s'il y avait un moyen de convertir sans passer par la case ouverture...

  2. #2
    Membre actif Avatar de CristofMartins
    Homme Profil pro
    ICH-DEV
    Inscrit en
    Juillet 2012
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : ICH-DEV
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 140
    Points : 219
    Points
    219
    Par défaut
    Salut,
    Moi perso j'avais trouvé une fonction basique qui peut-être peut t'aider.
    PS: cette solution ne marche que avec PDFCreator.

    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
     
    Function Sheet_Print(Name_print As String, Name_Sheet As String)
     
        Dim sht_Sheet As Worksheet
        Dim jobPDF As Object
        Dim sNomPDF As String
        Dim sCheminPDF As String
     
     
        Set sht_Sheet = Sheets(Name_Sheet)
     
        sNomPDF = Name_print & ".pdf"
        sCheminPDF = "C:\Users\Desktop\Data"
     
        If IsEmpty(sht_Sheet.UsedRange) Then Exit Function
     
        Set jobPDF = CreateObject("PDFCreator.clsPDFCreator")
     
        With jobPDF
            If .cStart("/NoProcessingAtStartup") = False Then
                MsgBox "Initialisation de PDFCreator impossible", vbCritical + vbOKOnly, "PDFCreator"
                Exit Function
            End If
            .cOption("UseAutosave") = 1
            .cOption("UseAutosaveDirectory") = 1
            .cOption("AutosaveDirectory") = sCheminPDF
            .cOption("AutosaveFilename") = sNomPDF
            .cOption("AutosaveFormat") = 0
            .cClearCache
        End With
     
        sht_Sheet.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
     
    End Function

  3. #3
    Expert éminent sénior
    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
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut,dans le même style : tu installes PDFCreator
    Ensuite tu lances le moniteur d'impression PDFCreator.exe
    puis Drag & Drop des fichiers concernés dans la fenêtre de PDFCreator.exe
    Cela sans savoir si cela accélérera les choses.

  4. #4
    Membre actif Avatar de CristofMartins
    Homme Profil pro
    ICH-DEV
    Inscrit en
    Juillet 2012
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : ICH-DEV
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 140
    Points : 219
    Points
    219
    Par défaut
    En tout cas ma proposition, testé et utilisé fais en moyenne 2 voir 3 sec(dependant de la taille et rapidité de l'ordi) par création d'un PDF. Elle ne l'ouvre pas. Ca tourne en arrière plan en gros.

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Salut,

    J'essaie de tester vos deux solutions, et j'ai un problème pour chacune d'entre elles...

    Si j'utilise le drag and drop de kiki29, PDF Creator envoie quand même une impression sur mon imprimante par défaut, quand il ne plante pas... Je vais regarder dans les options que je n'ai jamais explorées.

    Quant à celle de CristofMartins, elle me plaît bien, mais je ne sais pas quoi faire de la variable sht_Sheet. Si je comprends bien, il s'agit du nom de l'onglet à imprimer, mais je ne suis pas sûr qu'il ait le même nom dans chacun de mes fichiers. Je cherche comment déclarer qu'il faut imprimer le premier onglet seulement.

    Ouais, je viens de comprendre qu'il faut quand même ouvrir mon fichier avec la routine de CristofMartins, et que je peux donc déclarer la feuille que je veux imprimer.
    Résultat: je ne mets plus qu'une minute pour convertir mon fichier .xls en .pdf. 50% de temps en moins! Mais vu le nombre de fichiers que j'ai à convertir, j'en ai encore pour plus de 13 heures. :/

  6. #6
    Membre actif Avatar de CristofMartins
    Homme Profil pro
    ICH-DEV
    Inscrit en
    Juillet 2012
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : ICH-DEV
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 140
    Points : 219
    Points
    219
    Par défaut
    Salut,
    Selon la routine que je t'ai donné, ton fichier ne devrait pas s'ouvrir. Et ne devrait pas faire 1 minute pour chaque fichier, sauf si ton fichier il contient quelques dizaines de pages.

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Salut,

    J'ai sûrement mal compris ton code... est-ce que tu peux m'expliquer à quoi sert la variable sht_Sheet alors?

  8. #8
    Membre actif Avatar de CristofMartins
    Homme Profil pro
    ICH-DEV
    Inscrit en
    Juillet 2012
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : ICH-DEV
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 140
    Points : 219
    Points
    219
    Par défaut
    ma variable sht_sheets est le nom de feuille que je veux imprimer.
    ma fonction peut-être appellé de partout de mon code (car ou je l'ai utilisé, j'avais une centaine de feuilles) et chaque feuille devait être imprimé.
    donc A l'appel de ma fonction je lui envoyait comme paramêtre le nom de la feuille excel que je voulais imprimer ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    .....
    nomfeuille = "feuil1"
    mafonction nomfeuille
    .....
    et voila ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mafonction (sht_sheet as worksheet)
    .....

    c'etait quelque chose comme sa si je me rappelle bien

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    J'ai eu beau relire ton code, je n'ai pas vu où on faisait mention du fichier à imprimer. Je ne sais même pas si ma question avait un sens d'ailleurs...
    Alors, finalement, j'ai bricolé ce bout de code. Ce n'est pas hyper rapide, mais déjà bien plus qu'au début, en rendant simplement l'application invisible.

    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
    Sub BoucleFichiers()
    Dim strChemin As String, strFichier As String, strTitre As String, strCheminPDF As String
     
    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
        .Visible = False
    End With
     
    'Définit le répertoire contenant les fichiers
    strChemin = "C:\..."
    strCheminPDF = "C:\..."
     
    'Boucle sur les Fichiers du répertoire
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = Fso.GetFolder(strChemin)
     
    For Each Fichier In SourceFolder.Files
     
        Set clCible = Workbooks.Open(Fichier)
        Set fCible = clCible.Worksheets(1)
        strTitre = Left(clCible.Name, InStr(1, clCible.Name, ".", vbTextCompare) - 1)
        fCible.ExportAsFixedFormat xlTypePDF, strCheminPDF & strTitre
        clCible.Close False
     
    Next Fichier
     
    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .EnableEvents = True
        .Visible = True
    End With

  10. #10
    Membre actif Avatar de CristofMartins
    Homme Profil pro
    ICH-DEV
    Inscrit en
    Juillet 2012
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : ICH-DEV
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 140
    Points : 219
    Points
    219
    Par défaut
    Salut,
    Juste une question : Tu utilise PDFCreator ?

    Et pour répondre a ta question, je n'utilise pas de nom de fichier mais si un nom de feuil parce que le code s’exécute à l'ouverture de mon fichier.

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Salut,

    Oui, j'utilise bien PDF Creator. Et ton code fonctionne si j'ouvre le fichier que je veux convertir.

    J'ai une question pour toi, par contre. Les feuilles que tu imprimes sont dans le fichier que tu ouvres, ou dans un fichier complètement fermé?

  12. #12
    Membre actif Avatar de CristofMartins
    Homme Profil pro
    ICH-DEV
    Inscrit en
    Juillet 2012
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : ICH-DEV
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 140
    Points : 219
    Points
    219
    Par défaut
    Dans le fichier que j'ouvre.

  13. #13
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Bonsoir,

    Pardon pour la réponse tardive. Alors, je pense qu'on s'était mal compris. Je voulais en fait convertir un fichier qui n'était pas du tout ouvert, en pdf, et non pas un onglet du fichier sur lequel je travaille.
    Mon code fonctionne à peu près bien, c'est le plus important. Merci pour l'aide, je clos ce fil.

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

Discussions similaires

  1. Récupérer des infos sans ouvrir les fichiers
    Par hakuna_du_94 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/12/2008, 08h56
  2. exécution d'une macro sans ouvrir le fichier
    Par sash6 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/05/2008, 11h49
  3. Imprimer un fichier pdf sans ouvrir acrobat
    Par llaurentt dans le forum Windows
    Réponses: 12
    Dernier message: 18/02/2008, 23h40
  4. Réponses: 4
    Dernier message: 13/11/2007, 10h10
  5. VBA/Word/Excel97/Imprimer un pdf sans ouvrir acrobat
    Par ouskel'n'or dans le forum VBA Word
    Réponses: 2
    Dernier message: 28/09/2005, 21h40

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