Imprimer les PDF d'un dossier depuis Excel

Résolu
Bonjour tout le monde,

Voila mon problème j'ai dans "Mes Documents" un dossier dont le chemin est le suivant :

D:\Session_Cyril\Mes documents\Facture Travail\

J'enregistre dans ce dossier toutes mes factures depuis Excel en PDF. Je souhaiterais savoir s'il m'est possible d'avoir un bouton qui enverrai automatiquement tout le contenu du dossier (donc des fichier PDF) à l'imprimante ?

J'ai trouvé le code suivant sur internet, j'y ai inséré mon chemin d'accès vers mon dossier, mais comme dirait Thierry Lhermite "Le temps passe et rien ne se passe, on est dans l'impasse" :D

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Sub ImprimerFichier()
Dim NomFichier As String
Dim x As Long

x = FindWindow("XLMAIN", Application.Caption)
NomFichier = "D:\Session_Cyril\Mes documents\Facture Travail.pdf"

ShellExecute x, "print", NomFichier, "", "", 1
End Sub

Alors je ne sait pas si ce code est fonctionnel ou pas, mais moi quand je clique sur le bouton qui y est associé, rien ne se passe. Si quelqu'un peux m'aider ce sera avec plaisir, merci.

36 réponses

Résumé de la discussion

Impression automatique de tous les fichiers PDF d'un dossier via une macro Excel constitue la problématique centrale, souhaitant envoyer l'ensemble du contenu de D:\Session_Cyril\Mes documents\Facture Travail vers l'imprimante d'un seul geste. Des propositions suggèrent d'utiliser Dir pour boucler sur *.PDF dans le dossier et d'appeler Shell Execute avec l'opération 'print' sur chaque fichier, tout en ajustant le chemin. D'autres échanges évoquent la fermeture d'Acrobat pour éviter que les PDFs ne s'ouvrent et la gestion des erreurs, ainsi que des variantes qui n'impriment pas en arrière-plan ou qui ouvrent des documents Word. Certains retours soulignent que le comportement dépend du lecteur PDF utilisé et suggèrent de viser une solution qui n'ouvre pas l'application associée, afin d'imprimer silencieusement sans intervention utilisateur.

Bobot (l’IA à votre service)
  1. Bonjour,

    ce code marche tres bien, ai ajoute boucle sur les fichiers PDF du dossier

    Option Explicit

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
    , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

    Sub ImprimerFichier()
    Dim x As Long, Chemin_Fichier As String, Nom_Fichier As String

    Chemin_Fichier = "D:\Session_Cyril\Mes documents\"
    x = FindWindow("XLMAIN", Application.Caption)
    Nom_Fichier = Dir(Chemin_Fichier & "*.PDF")
    'boucle nom de fichier PDF
    Do While Nom_Fichier <> ""
    ShellExecute x, "print", Chemin_Fichier & Nom_Fichier, "", "", 1
    Nom_Fichier = Dir
    Loop

    End Sub
    0
    1. Bonjour f894009 et merci pour ta réponse.

      Alors effectivement, en mettant le code que tu ma donné, cela fonctionne. En revanche, cela m'ouvre aussi Adobe Rearder.

      Est il possible que les fichiers aille à l'imprimante (cela fonctionne merci à toi) sans s'ouvrir ?
      0
      1. Re,

        En revanche, cela m'ouvre aussi Adobe Rearder. Surprenant car pas chez moi !!!!!!!!! Vous n'auriez pas pdfcreator en imprimante ???????
        0
        1. Non je n'ai même pas PDF CREATOR du tout.
          0
          1. J'ai :

            Adobe Rearder IX
            Adobe Shockwave Player 12.0
            Adobe Flash Player 11 Plugin
            Adobe Air
            Adobe Flash Player 10 ActiveX
            Acrobat.com

            Si'il y a quelque chose de là que je doit virer je le fait. Mais je ne sais pas quoi
            0
            1. Re,

              Rectification, ca ouvre bien Adobe Reader. Je regarde.

              A+
              0
              1. Re,

                A titre d'info, si vous imprimez un .docx, Word s'ouvre mais se referme tout seul.
                0
                1. Re, effectivement, là le fichier s'ouvre et se ferme tout seul. Cela ne pourrait t'il pas venir de ce qui permet d'ouvrir les PDF sur le PC ?
                  0
                  1. Re,

                    ce qui permet d'ouvrir les PDF sur le PC Oui, mais adobe est oblige de s'ouvrir pour imprimer le fichier
                    0
                    1. Donc il ne pourras se fermer automatiquement comme word ?

                      Parce que à la limite je m'en fiche qu'il s'ouvre s'il se ferme seul. Ne peux ton pas programmer qu'il se ferme tout seul alors ?
                      0
                      1. Re,

                        C'est ce que je cherche, qu'il se ferme tout seul. Ai trouve quelques codes, mais pas marche.

                        Je continue
                        0
                        1. merci je cherche aussi de mon coter si je trouve avant je te préviens :)
                          0
                          1. J'ai trouver ce bout de code, mais impossible de le faire fonctionner avec le reste

                            Sub Ferme_Pdf()
                            Const WM_SYSCOMMAND& = &H112, SC_CLOSE& = &HF060
                            SendMessage Apphwnd, WM_SYSCOMMAND, SC_CLOSE, 0&
                            End Sub
                            0
                            1. alors j'ai trouver ce code qui mentionne bien la fermeture du pdf, mais qui au lieu de me fermer le pdf m'envoie le fichier excel entier a l'imprimante.

                              Sub test()
                              Dim Wk As Workbook
                              Set Wk = Workbooks("MATRICE FIDELIA TVA 101.xlsm")
                              ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
                              Imprimante_AdobePDF, Collate:=True
                              Call Fermer_Un_Programme("Acrobat.exe")
                              Wk.Activate
                              End Sub

                              Sub Fermer_Un_Programme(Prog As String)
                              Dim StrComputer As String, objWMIService As Object
                              StrComputer = "."
                              Set objWMIService = GetObject("winmgmts:" _
                              & "{impersonationLevel=impersonate}!\\" & StrComputer & "\root\cimv2")
                              Set colProcessList = objWMIService.ExecQuery _
                              ("Select * from Win32_Process Where Name = '" & Prog & "'")
                              For Each objProcess In colProcessList
                              objProcess.Terminate
                              Next
                              End Sub

                              Si tu peux en faire quelque chose de mieux ?
                              0
                              1. Re,

                                au lieu de me fermer le pdf m'envoie le fichier excel ben oui, le code est fait pour ca. Je regarde ce que je peux en faire pur la fermeture de adobe reader (ce n'est pas acrobat.exe, mais AcroRd32.exe)

                                A+
                                0
                                1. Re,

                                  devrait aller:

                                  Option Explicit

                                  Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                                  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

                                  Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
                                  (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
                                  , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

                                  'imprimer fichier PDF depuis EXCEL
                                  Sub ImprimerFichier()
                                  Dim x As Long, Chemin_Fichier As String, Nom_Fichier As String, Acrobat

                                  Chemin_Fichier = "D:\Session_Cyril\Mes documents\"
                                  x = FindWindow("XLMAIN", Application.Caption)
                                  Nom_Fichier = Dir(Chemin_Fichier & "*.PDF")
                                  'boucle nom de fichier PDF
                                  Do While Nom_Fichier <> ""
                                  ShellExecute x, "print", Chemin_Fichier & Nom_Fichier, "", "", 1
                                  'attente
                                  Application.Wait (Now + TimeValue("0:00:01"))
                                  Call Fermer_Un_Programme("AcroRd32.exe")
                                  Nom_Fichier = Dir
                                  Loop

                                  End Sub

                                  Sub Fermer_Un_Programme(Prog As String)
                                  Dim StrComputer As String, objWMIService As Object, objProcess, colProcessList

                                  StrComputer = "."
                                  Set objWMIService = GetObject("winmgmts:" _
                                  & "{impersonationLevel=impersonate}!\\" & StrComputer & "\root\cimv2")
                                  Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & Prog & "'")
                                  For Each objProcess In colProcessList
                                  objProcess.Terminate
                                  Next
                                  End Sub


                                  A+
                                  0
                                  1. Si j'ai bien compris tout ce code remplace aussi celui qui imprime les pdf qui se trouvent dans le dossier.

                                    Seulement cela m'affiche une erreur d'exécution '-2147217406 (80041002)':

                                    Non trouvé

                                    et quand je clique sur débogage, ça m'envoie dans Visual Basic et la phrase suivante est surligné en jaune :

                                    objProcess.Terminate
                                    0
                                    1. Si j'augmente le TimeValue :

                                      Application.Wait (Now + TimeValue("0:00:50"))

                                      ça marche, mais quand le pdf se ferme, l'erreur de débogage apparaît et un seul fichier sur deux est envoyer a l'imprimante.

                                      Désolé je voie bien que c'est pas évident et merci encore pour l'aide apporté
                                      0
                                      • 1
                                      • 2