OVH Cloud OVH Cloud

Impression d'un fichier en VBA

3 réponses
Avatar
Patrick EVEN
Bonjour,

Connaissant le nom complet d'un fichier, j'aimerais savoir
comment faire en VBA pour l'imprimer sans avoir à l'ouvrir,
sur l'imprimante par défaut.

Ce fichier peut être un document Word, un classeur Excel,
un fichier .pdf, ou d'un type que je ne connais pas à l'avance.

C'est un peu comme si je faisais appel au menu contextuel sur un fichier
dans l'explorer Windows pour clicker sur la commande "Imprimer".

Cordialement,
Patrick EVEN

3 réponses

Avatar
Jean-Marc
"Patrick EVEN" a écrit dans le message de
news:%23rj%
Bonjour,

Connaissant le nom complet d'un fichier, j'aimerais savoir
comment faire en VBA pour l'imprimer sans avoir à l'ouvrir,
sur l'imprimante par défaut.

Ce fichier peut être un document Word, un classeur Excel,
un fichier .pdf, ou d'un type que je ne connais pas à l'avance.

C'est un peu comme si je faisais appel au menu contextuel sur un


fichier
dans l'explorer Windows pour clicker sur la commande "Imprimer".




Hello,

tout simplement avec ShellExecute et le verbe "print".

Il ouvrira tout seul ce qu'il faut et imprimera, comme si on
le faisait depuis le menu contextuel.
Voir la doc de ShellExecute() pour la signification des
différents paramètres si nécessaire.


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
Private Const SW_SHOWNORMAL As Long = 1


Private Sub Command1_Click()
Dim s As String

' par exemple un document word
s = "c:truc.doc"

ShellExecute hwnd, "print", s, vbNullString, vbNullString,
SW_SHOWNORMAL

End Sub


--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Patrick EVEN
Jean-Marc,

Merci.
C'est bien ce qu'il me fallait.

Le fichier que j'imprime est un fichier temporaire.
Je dois le détruire après son impression.

Comment puis-je le détruire sans que la commande d'impression
me fasse remarquer que le fichier n'existe plus ?

Une exécution en mode synchrone en quelque sorte.

Cordialement,
Patrick EVEN

Même si j'appartiens à la première des 10 catégories,
j'ai encore beaucoup à apprendre !

"Jean-Marc" a écrit dans le message de news:
43f4d6f3$0$29223$
"Patrick EVEN" a écrit dans le message de
news:%23rj%
Bonjour,

Connaissant le nom complet d'un fichier, j'aimerais savoir
comment faire en VBA pour l'imprimer sans avoir à l'ouvrir,
sur l'imprimante par défaut.

Ce fichier peut être un document Word, un classeur Excel,
un fichier .pdf, ou d'un type que je ne connais pas à l'avance.

C'est un peu comme si je faisais appel au menu contextuel sur un


fichier
dans l'explorer Windows pour clicker sur la commande "Imprimer".




Hello,

tout simplement avec ShellExecute et le verbe "print".

Il ouvrira tout seul ce qu'il faut et imprimera, comme si on
le faisait depuis le menu contextuel.
Voir la doc de ShellExecute() pour la signification des
différents paramètres si nécessaire.


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
Private Const SW_SHOWNORMAL As Long = 1


Private Sub Command1_Click()
Dim s As String

' par exemple un document word
s = "c:truc.doc"

ShellExecute hwnd, "print", s, vbNullString, vbNullString,
SW_SHOWNORMAL

End Sub


--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;



Avatar
Jean-Marc
Hello,

tu peux faire une exécution synchrone avec
l'API WaitForSingleObject. Voici par exemple comment faire:

Option Explicit

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal
hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId
As Long) 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

'
' TODO: ajouter une gestion d'erreur
'
Private Function PrintWhatever(myDoc As String) As Boolean
Dim mProcess As Long
Dim mRet As Long
Dim mPID As Long

On Error GoTo PrintWhatever_Error

mPID = ShellExecute(0&, "print", myDoc, vbNullString, vbNullString,
0&)
mProcess = OpenProcess(&H1F0FFF, 0, mPID)
Do
mRet = WaitForSingleObject(mProcess, 1000)
If mRet <> &H102& Then
Exit Do
End If
DoEvents
Loop
CloseHandle mProcess
PrintWhatever = True
PrintWhatever_End:
Exit Function

PrintWhatever_Error:
Resume PrintWhatever_End
End Function

Private Sub Command1_Click()
Dim r As Boolean

r = PrintWhatever("c:truc.doc")
If r Then
MsgBox "impression finie."
' ici on peut faire kill c:truc.doc
Else
' ici qq chose s'est mal passé
End If
End Sub

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;



"Patrick EVEN" a écrit dans le message de
news:
Jean-Marc,

Merci.
C'est bien ce qu'il me fallait.

Le fichier que j'imprime est un fichier temporaire.
Je dois le détruire après son impression.

Comment puis-je le détruire sans que la commande d'impression
me fasse remarquer que le fichier n'existe plus ?

Une exécution en mode synchrone en quelque sorte.

Cordialement,
Patrick EVEN

Même si j'appartiens à la première des 10 catégories,
j'ai encore beaucoup à apprendre !

"Jean-Marc" a écrit dans le message de


news:
43f4d6f3$0$29223$
> "Patrick EVEN" a écrit dans le message de
> news:%23rj%
>> Bonjour,
>>
>> Connaissant le nom complet d'un fichier, j'aimerais savoir
>> comment faire en VBA pour l'imprimer sans avoir à l'ouvrir,
>> sur l'imprimante par défaut.
>>
>> Ce fichier peut être un document Word, un classeur Excel,
>> un fichier .pdf, ou d'un type que je ne connais pas à l'avance.
>>
>> C'est un peu comme si je faisais appel au menu contextuel sur un
> fichier
>> dans l'explorer Windows pour clicker sur la commande "Imprimer".
>>
>
> Hello,
>
> tout simplement avec ShellExecute et le verbe "print".
>
> Il ouvrira tout seul ce qu'il faut et imprimera, comme si on
> le faisait depuis le menu contextuel.
> Voir la doc de ShellExecute() pour la signification des
> différents paramètres si nécessaire.
>
>
> 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
> Private Const SW_SHOWNORMAL As Long = 1
>
>
> Private Sub Command1_Click()
> Dim s As String
>
> ' par exemple un document word
> s = "c:truc.doc"
>
> ShellExecute hwnd, "print", s, vbNullString, vbNullString,
> SW_SHOWNORMAL
>
> End Sub
>
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>