Imprimer les PDF d'un dossier depuis Excel

Résolu
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention   -  
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention   -
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.
A voir également:

36 réponses

cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
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
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
Re,

Ceci dit, je n'ai eu qu'une seule fois l'erreur d'exécution '-2147217406 ..... au debut et jamais depuis !!!!!
0
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai trouver des choses qui pourraient être intéressante ici, mais cela ne fonctionne pas.

https://www.excel-downloads.com/threads/vba-gerer-les-impressions-par-vba.32925/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
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
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
Alors là ce serait le paradis :)
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
Re,

je vous fait ca.

A+
0
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
Vous êtes génial merci beaucoup :)
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
Avec ce code, il m'envoie une des douze facture à l'imprimante et m'affiche une erreur de débogage sur : objProcess.Terminate
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
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
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
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
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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
cyrga11 Messages postés 48 Date d'inscription   Statut Membre Dernière intervention  
 
Ç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