Imprimer les PDF d'un dossier depuis Excel - Page 2

Résolu
Précédent
  • 1
  • 2
  1. cyrga11 Messages postés 48 Statut Membre
     
    Alors j'ai réussi quelques petits trucs, grâce à toi.

    En module 2 j'ai collé ton code pour commandé l'envoi des fichier pour l'imprimante :

    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\FACTURE TRAVAIL\"
    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

    Et en module 3 j'ai collé ce code qui reprend le tiens et rajoute des ligneS depuis Sub Ferme_PDF () :

    Sub Fermer_Un_Programme(Prog As String)
    Dim StrComputer As String, objWMIService As Object
    StrComputer = "."
    On Error Resume Next
    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

    Sub Ferme_PDF()
    Dim Wk As Workbook
    Set Wk = Workbooks("MATRICE FIDELIA TVA 101.xlsm") ' mettre ici le nom du fichier xlsm qui ferme le pdf
    Call Fermer_Un_Programme("AcroRd32.exe")
    Wk.Activate
    End Sub

    Chaque fonction s'exécute à partir d'un bouton différent. Avec le bouton IMP j'envoie les factures pdf à l'imprimante et avec le bouton CLOSE je ferme le fichier pdf.

    Seulement voila, je me heurte à un nouveau problème. Je ne peux pas cliquer sur le bouton CLOSE tant que tout les fichiers ne sont pas arrivé à l'imprimante et je je ne peux le savoir qu'en ouvrant : Afficher les travaux d'impression en cours".

    Alors y aurait il un moyen pour que le bouton IMP m'ouvre aussi "Afficher les travaux d'impression en cours" et que le bouton CLOSE ferme cette fenêtre en plus du pdf ?
    0
  2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    1/ dans ce code ce qui est en gras ne vous sert a rien pour votre contexte

    Sub Ferme_PDF()
    Dim Wk As Workbook
    Set Wk = Workbooks("MATRICE FIDELIA TVA 101.xlsm") ' mettre ici le nom du fichier xlsm qui ferme le pdf
    Call Fermer_Un_Programme("AcroRd32.exe")
    Wk.Activate
    End Sub


    2/cliquer sur le bouton CLOSE tant que tout les fichiers

    cette ligne de code,
    Application.Wait (Now + TimeValue("0:00:01"))
    sert a attendre que le fichier soit recu en memoire dans l'imprimante, j'ai mis 1 seconde, mais suivant le PC, 2 a 3 secondes suffisent

    Je regarde pour la boite impression en attente
    0
  3. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    Ceci dit, je n'ai eu qu'une seule fois l'erreur d'exécution '-2147217406 ..... au debut et jamais depuis !!!!!
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. cyrga11 Messages postés 48 Statut Membre
     
    Alors j'ai trouver ce code qui me conviendrait très bien :

    Option Explicit

    Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" _
    (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long

    Private Declare Function ClosePrinter Lib "winspool.drv" _
    (ByVal hPrinter As Long) As Long

    Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" _
    (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, _
    ByVal Level As Long, pJob As Any, ByVal cdBuf As Long, pcbNeeded As Long, _
    pcReturned As Long) As Long

    Sub fichiersFileAttenteImpression()
    Dim hPrinter As Long, lNeeded As Long, lReturned As Long
    Dim lJobCount As Long

    'Adaptez le nom de l'imprimante
    OpenPrinter "HP Officejet 4500 G510n-z_TMP00", hPrinter, ByVal 0&
    EnumJobs hPrinter, 0, 99, 1, ByVal 0&, 0, lNeeded, lReturned

    If lNeeded > 0 Then
    ReDim byteJobsBuffer(lNeeded - 1) As Byte
    EnumJobs hPrinter, 0, 99, 1, byteJobsBuffer(0), lNeeded, lNeeded, lReturned

    If lReturned > 0 Then
    lJobCount = lReturned
    Else
    lJobCount = 0
    End If

    Else

    lJobCount = 0
    End If

    ClosePrinter hPrinter
    MsgBox "nombre de documents dans la file d'attente: " + _
    CStr(lJobCount), vbInformation
    End Sub
    Mais ma question est, est'il possible de faire en sorte que la boite de dialogue s'affiche seule une fois que tout les fichiers sont arrivés à l'imprimante à la suite de ce code là :

    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\Facture FIDELIA\"
    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

    Si ce n'est pas possible ce n'est pas grave, je rajouterais un bouton de plus et puis voila.
    0
  6. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    C'est bien d'avoir chercher, j'ai vu ces codes, mais je pense qu'il y a beaucoup plus simple.

    Compter le nombre de PDF dans le repertoire et decompter au moment de l'impression (apres la ligne d'attente), des que plus de fichier, appel du code de fermeture acrord32.

    qu'en pensez-vous ???
    0
  7. cyrga11 Messages postés 48 Statut Membre
     
    Alors là ce serait le paradis :)
    0
  8. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    je vous fait ca.

    A+
    0
  9. cyrga11 Messages postés 48 Statut Membre
     
    Vous êtes génial merci beaucoup :)
    0
  10. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    Apres simple reflexion pas d=besoin de compter les fichiers, fermer acrord32 apres la mise en file d'attente du dernier fichier

    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 Imprimer_Fichier()
    Dim x As Long, Chemin_Fichier As String, Nom_Fichier As String, Acrobat, Chemin As String, NFichiers As Byte

    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:02"))
    Nom_Fichier = Dir
    Loop
    'attente
    Application.Wait (Now + TimeValue("0:00:02"))
    Call Fermer_Un_Programme("AcroRd32.exe")
    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
  11. cyrga11 Messages postés 48 Statut Membre
     
    Avec ce code, il m'envoie une des douze facture à l'imprimante et m'affiche une erreur de débogage sur : objProcess.Terminate
    0
  12. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    chez moi avec votre programme: aucune erreur

    avec pdfcreator: attente a 2 secondes
    avec une imprimante: attente a 5 secondes

    Avant cette modif:
    Vous n'appuyez sur le bouton qu'a la fin ????
    0
  13. cyrga11 Messages postés 48 Statut Membre
     
    Petite question, les fichiers sont censé se mettre en attente d'impression, mais l'imprimante doit'elle forcément être allumé pour recevoir les fichiers en attentes ?

    Le problème viens peut-être de là sur mon pc
    0
  14. cyrga11 Messages postés 48 Statut Membre
     
    avant cette modif :

    j'appuie sur le bouton : imp facture pour lancer les fichier a l imprimante

    sur le bouton : etat imp pour voir si les fichier sont arrivé en attente d impression

    et sur le fichier : close pdf pour fermer le fichier

    ce dernier code que vous m'avez donné, je l'ai mis dans le bouton imp facture et j'appuie dessus pour envoyer les fichiers à l'imprimante.
    0
  15. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    si le spooler d'imprimante est en service, les fichiers se placent dans une zone memoire tampon en attendant que l'imprimante soit detectee et vous pouvez les voir en ouvrant la fenetre travaux en attente de l'imprimante par defaut
    0
  16. cyrga11 Messages postés 48 Statut Membre
     
    Ça y est, je viens de réussir à faire marcher ton code. Le problème sur mon pc venait des TimeValue. Je l'ai ai passer de 02 à 10 et ça fonctionne.

    Un très grand merci à toi f894009 pour ta patience et ton savoir faire. ;)
    0
Précédent
  • 1
  • 2