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 -
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.
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:
- Imprimer les PDF d'un dossier depuis Excel
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Imprimer un tableau excel - Guide
- Liste déroulante excel - Guide
- Comment faire un dossier pdf - Guide
- Word et excel gratuit - Guide
36 réponses
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 ?
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 ?
Bonjour,
1/ dans ce code ce qui est en gras ne vous sert a rien pour votre contexte
2/cliquer sur le bouton CLOSE tant que tout les fichiers
cette ligne de code,
Je regarde pour la boite impression en attente
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
Re,
Ceci dit, je n'ai eu qu'une seule fois l'erreur d'exécution '-2147217406 ..... au debut et jamais depuis !!!!!
Ceci dit, je n'ai eu qu'une seule fois l'erreur d'exécution '-2147217406 ..... au debut et jamais depuis !!!!!
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/
https://www.excel-downloads.com/threads/vba-gerer-les-impressions-par-vba.32925/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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 ???
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 ???
Re,
Apres simple reflexion pas d=besoin de compter les fichiers, fermer acrord32 apres la mise en file d'attente du dernier fichier
A+
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+
Avec ce code, il m'envoie une des douze facture à l'imprimante et m'affiche une erreur de débogage sur : objProcess.Terminate
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 ????
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 ????
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
Le problème viens peut-être de là sur mon pc
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.
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.
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
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