OVH Cloud OVH Cloud

Aperçu avant impression

3 réponses
Avatar
Patrick Fredin
Bonjour,

J'ai bloqué l'impression d'une feuille Excel quand on clique sur le bouton
"Imprimer" ou qu'on utilise la commande dans le menu "Fichier" parce que je
veux imposer le choix de critères avant l'impression.

Par contre, je ne voudrais pas bloquer quand on choisis l'aperçu avant
impression.

Est-il possible, en VBA, de détecter qu'on a lancé la commande d'aperçu (par
le menu ou en cliquant sur le bouton) ?

Merci pour votre aide.

--
Patrick

3 réponses

Avatar
MichDenis
Bonjour Patrick,

Dans la fenêtre Aperçu avant impression, il y a un bouton à partir duquel il est possible de lancer l'impression du
document. Personnellement, je ne connais pas de façon d'inhiber l'action de ce bouton. En conséquence, si tu donnes
accès à cette fenêtre à l'usager.... il pourra imprimer à moins que tu saches comment faire pour annuler l'action du
bouton imprimer de cette fenêtre. (ci c'est le cas, j'aimerais bien que tu partages ta façon de faire !)


Salutations!



"Patrick Fredin" a écrit dans le message de news:

Bonjour,

J'ai bloqué l'impression d'une feuille Excel quand on clique sur le bouton
"Imprimer" ou qu'on utilise la commande dans le menu "Fichier" parce que je
veux imposer le choix de critères avant l'impression.

Par contre, je ne voudrais pas bloquer quand on choisis l'aperçu avant
impression.

Est-il possible, en VBA, de détecter qu'on a lancé la commande d'aperçu (par
le menu ou en cliquant sur le bouton) ?

Merci pour votre aide.

--
Patrick
Avatar
Alain CROS
Bonjour.

Je n'ai pas tester tous les cas de figures, mais ça doit le faire.

Dans un module.

Private Declare Function SetWindowsHookEx& _
Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&)

Private Declare Function GetCurrentThreadId& _
Lib "kernel32" _
()

Private Declare Function UnhookWindowsHookEx& _
Lib "user32" _
(ByVal hHook&)

Private Declare Function GetClassName& Lib "user32" _
Alias "GetClassNameA" (ByVal hWnd&, ByVal lpClassName$, ByVal nMaxCount&)

Private Declare Function GetDlgCtrlID& Lib "user32" _
(ByVal hWnd&)

Private Declare Function SetWindowLong& _
Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)

Private Declare Function CallWindowProc& _
Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)

Private LeHook&, OldWinProc&

Private Function NomDeClass$(hWnd&)
NomDeClass = Space$(20&)
NomDeClass = Left$(NomDeClass, GetClassName(hWnd, NomDeClass, 20&))
End Function

Sub ApercuAvantImpression()
Const WH_CBT& = &H5
LeHook = SetWindowsHookEx(WH_CBT, AddressOf HookMsgb, 0&, GetCurrentThreadId)
Application.Dialogs(xlDialogPrintPreview).Show
UnhookWindowsHookEx LeHook
End Sub

Private Function ImpProc&(ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)
Const WM_DESTROY& = &H2, GWL_WNDPROC& = -4&, BM_SETSTATE& = &HF3
If Msg = WM_DESTROY Then
SetWindowLong wParam, GWL_WNDPROC, OldWinProc
End If
If Msg = BM_SETSTATE Then
If wParam = 1& Then
MsgBox "Impossible d'imprimer.", vbCritical, "Spécial MichDenis"
End If
Exit Function
End If
ImpProc = CallWindowProc(OldWinProc, hWnd, Msg, wParam, lParam)
End Function

Private Function HookMsgb&(ByVal lMsg&, ByVal wParam&, ByRef lParam&)
Const HCBT_ACTIVATE& = 5&, GWL_WNDPROC& = -4&, HCBT_SETFOCUS& = 9&
If lMsg = HCBT_SETFOCUS Then
If NomDeClass(wParam) = "Button" Then
If GetDlgCtrlID(wParam) = 3& Then
UnhookWindowsHookEx LeHook
OldWinProc = SetWindowLong(wParam, GWL_WNDPROC, AddressOf ImpProc)
End If
End If
End If
End Function

Alain CROS

"MichDenis" a écrit dans le message de news:
Bonjour Patrick,

Dans la fenêtre Aperçu avant impression, il y a un bouton à partir duquel il est possible de lancer l'impression du
document. Personnellement, je ne connais pas de façon d'inhiber l'action de ce bouton. En conséquence, si tu donnes
accès à cette fenêtre à l'usager.... il pourra imprimer à moins que tu saches comment faire pour annuler l'action du
bouton imprimer de cette fenêtre. (ci c'est le cas, j'aimerais bien que tu partages ta façon de faire !)


Salutations!


Avatar
MichDenis
Bravo Alain,

Cela fonctionne très bien. Il s'agit de lancer la procédure "Sub ApercuAvantImpression()" pour obtenir la fenêtre
"Aperçu avant impression" et inhiber le bouton "imprimer" de cette fenêtre.

Bonne fin de journée,


Salutations!





"Alain CROS" a écrit dans le message de news:
Bonjour.

Je n'ai pas tester tous les cas de figures, mais ça doit le faire.

Dans un module.

Private Declare Function SetWindowsHookEx& _
Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&)

Private Declare Function GetCurrentThreadId& _
Lib "kernel32" _
()

Private Declare Function UnhookWindowsHookEx& _
Lib "user32" _
(ByVal hHook&)

Private Declare Function GetClassName& Lib "user32" _
Alias "GetClassNameA" (ByVal hWnd&, ByVal lpClassName$, ByVal nMaxCount&)

Private Declare Function GetDlgCtrlID& Lib "user32" _
(ByVal hWnd&)

Private Declare Function SetWindowLong& _
Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)

Private Declare Function CallWindowProc& _
Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)

Private LeHook&, OldWinProc&

Private Function NomDeClass$(hWnd&)
NomDeClass = Space$(20&)
NomDeClass = Left$(NomDeClass, GetClassName(hWnd, NomDeClass, 20&))
End Function

Sub ApercuAvantImpression()
Const WH_CBT& = &H5
LeHook = SetWindowsHookEx(WH_CBT, AddressOf HookMsgb, 0&, GetCurrentThreadId)
Application.Dialogs(xlDialogPrintPreview).Show
UnhookWindowsHookEx LeHook
End Sub

Private Function ImpProc&(ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)
Const WM_DESTROY& = &H2, GWL_WNDPROC& = -4&, BM_SETSTATE& = &HF3
If Msg = WM_DESTROY Then
SetWindowLong wParam, GWL_WNDPROC, OldWinProc
End If
If Msg = BM_SETSTATE Then
If wParam = 1& Then
MsgBox "Impossible d'imprimer.", vbCritical, "Spécial MichDenis"
End If
Exit Function
End If
ImpProc = CallWindowProc(OldWinProc, hWnd, Msg, wParam, lParam)
End Function

Private Function HookMsgb&(ByVal lMsg&, ByVal wParam&, ByRef lParam&)
Const HCBT_ACTIVATE& = 5&, GWL_WNDPROC& = -4&, HCBT_SETFOCUS& = 9&
If lMsg = HCBT_SETFOCUS Then
If NomDeClass(wParam) = "Button" Then
If GetDlgCtrlID(wParam) = 3& Then
UnhookWindowsHookEx LeHook
OldWinProc = SetWindowLong(wParam, GWL_WNDPROC, AddressOf ImpProc)
End If
End If
End If
End Function

Alain CROS

"MichDenis" a écrit dans le message de news:
Bonjour Patrick,

Dans la fenêtre Aperçu avant impression, il y a un bouton à partir duquel il est possible de lancer l'impression du
document. Personnellement, je ne connais pas de façon d'inhiber l'action de ce bouton. En conséquence, si tu donnes
accès à cette fenêtre à l'usager.... il pourra imprimer à moins que tu saches comment faire pour annuler l'action du
bouton imprimer de cette fenêtre. (ci c'est le cas, j'aimerais bien que tu partages ta façon de faire !)


Salutations!