OVH Cloud OVH Cloud

impression

6 réponses
Avatar
fredbzr
Bonjour à tous
Est-il possible d'empêcher un utilisateur d'imprimer un dossier ?
Si oui pouvez-vous m'indiquer la marche à suivre
merci d'avance
--


Fred

6 réponses

Avatar
RGI
Bonjour

Par VBA

Application.CommandBars("File").Controls(18).Enabled


salutations

RGI

Bonjour à tous
Est-il possible d'empêcher un utilisateur d'imprimer un dossier ?
Si oui pouvez-vous m'indiquer la marche à suivre
merci d'avance



Avatar
isabelle
bonjour fredbzr,

copie cette macro sur la page code de ThisWorkBook,

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
End Sub

isabelle


Bonjour à tous
Est-il possible d'empêcher un utilisateur d'imprimer un dossier ?
Si oui pouvez-vous m'indiquer la marche à suivre
merci d'avance


Avatar
fredbzr
Bonjour Isabelle
J'ai mis la macro dans le workbook et effectivement l'impression n'est plus
possible
mais je ne peux plus faire d'aperçu
"isabelle" a écrit dans le message de news:

bonjour fredbzr,

copie cette macro sur la page code de ThisWorkBook,

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
End Sub

isabelle


Bonjour à tous
Est-il possible d'empêcher un utilisateur d'imprimer un dossier ?
Si oui pouvez-vous m'indiquer la marche à suivre
merci d'avance




Avatar
isabelle
bonjour fredbzr,

Bonjour Isabelle
J'ai mis la macro dans le workbook et effectivement l'impression n'est plus
possible
mais je ne peux plus faire d'aperçu



c'est un peu plus compliqué mais pas infesable,
voici une méthode jadis donné par notre grand chef à 4 plumes, le légendaire Lucky Luke :
(ps / le tout à copier sur la page code de ThisWorkBook)


'==================================================== Voici une nouvelle procédure qui tient compte aussi des commandes de
menu et de la boîte de dialogue "Imprimer", en plus des deux boutons de
barres d'outils (plutôt complexe, cette affaire!!!)

'====================================================

Private Declare Function GetAsyncKeyState Lib "User32" _
(ByVal nVirtKey As Long) As Integer


Dim Test As Boolean
Dim MCtrl As Integer


#If VBA6 Then
#Else
Private Function Recurse(CmdB As Object) As Boolean
Dim Ctrl As CommandBarControl
On Error Resume Next
Recurse = True
For Each Ctrl In CmdB.Controls
If Ctrl.Type = msoControlPopup Then
If Recurse(Ctrl) Then Exit Function
Else
For MCtrl = 0 To 1
If Ctrl.Id = Array(109, 4)(MCtrl) Then
Ctrl.Execute
If Test Then Exit Function Else Test = True
End If
Next MCtrl
End If
Next Ctrl
Recurse = False
End Function
#End If


Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim CBars As CommandBars, CmdB As CommandBar
Dim XL8 As Boolean, CtrlP As Integer
CtrlP = GetAsyncKeyState(80)
On Error Resume Next
If Test Then
Cancel = True
Else
Set CBars = Application.CommandBars
XL8 = Application.Version Like "8*"
If CtrlP Then
Test = True
Else
#If VBA6 Then
Dim Ctrl As CommandBarButton
For MCtrl = 0 To 1
For Each Ctrl In CBars.FindControls(Id:=Array(109, 4)(MCtrl))
Test = True
Ctrl.Execute
If Test Then Exit For
Next Ctrl
If Test Then Exit For
Next MCtrl
#Else
For Each CmdB In CBars
If CmdB.Visible And CmdB.Enabled Then
Test = True
Test = Recurse(CmdB)
If Test Then Exit For
End If
Next CmdB
#End If
End If
If Test And MCtrl Then
MsgBox "Boîte de dialogue ""Imprimer"""
Else
If Not Test Then
Test = True
CBars.FindControl(Id:=IIf(XL8, 2521, 109)).Execute
End If
If (Test Eqv XL8) And MCtrl Then
MsgBox "Bouton ""Imprimer"""
Else
MsgBox "Bouton ""Aperçu avant impression"""
End If
End If
End If
Test = False
End Sub


'====================================================

En gros, le truc consiste à simuler un clic sur chacun des contrôles de
barres d'outils ou de menu (visibles et Enabled!) qui peuvent déclencher
l'événement BeforePrint, par la méthode Execute. Si c'est le même
contrôle que celui activé par l'utilisateur, rien ne se produit, sinon
BeforePrint est automatiquement rappelé de manière récursive. La
variable Test sert à détecter si cet appel récursif a eu lieu ou non, ce
qui permet d'identifier au final quel contrôle a déclenché l'événement.
Il y a de nombreuses différences de comportement selon que ce contrôle
est dans un menu déroulant ou une barre d'outils et selon la version
d'Excel utilisée, d'où la lourdeur de la macro.


Bref, c'est hautement bidouilleux, mais ça marche apparemment très bien.


La fonction Recurse sert à parcourir toutes les commandes de menu
"Imprimer" et "Aperçu" éventuellement présentes dans les barres de menu
visibles sous Excel 97, VBA 5 ne disposant pas de la méthode
CommandBars.FindControls disponible seulement sous VBA 6.


GetAsyncKeyState sert à intercepter les Ctrl-P éventuels.


Je ne sais toujours pas comment faire en sorte que VBA détecte si
l'utilisateur a lancé soit une impression soit un aperçu à partir de la
boîte de dialogue "Imprimer". Mais ce code permet déjà d'intercepter
l'affichage de cette boîte de dialogue, et éventuellement de l'annuler,
par:


'...
If Test And MCtrl Then
MsgBox "Vous devez utiliser le bouton ""Imprimer"" de la " _
& "barre d'outils Standard.", vbInformation
Cancel = True
Else ......

Avatar
fredbzr
Bonjour RGI
j'ai essayé et le résultat est : erreur 438, propriété non gérée par cet
objet.
je voudrais pouvoir imprimer, mais seulement moi, j'ai donc essayé:

Private Sub Workbook_beforeprint(Cancel As Boolean)
Dim mdp As String
mdp = InputBox("mot de passe pour l'impression")
If mdp <> "toto" Then
mdp = InputBox("mot de passe invalide essai N°2")
If mdp <> "toto" Then
mdp = InputBox("mot de passe invalide essai N°3")
If mdp <> "toto" Then
Cancel = True
MsgBox "désolé vous ne pouvez pas imprimer"
End If
End If
End If
End Sub

Mais le code intervient même pour l'aperçu, ce que je ne veux pas
As-tu une solution
"RGI" a écrit dans le message de
news:
Bonjour

Par VBA

Application.CommandBars("File").Controls(18).Enabled


salutations

RGI

Bonjour à tous
Est-il possible d'empêcher un utilisateur d'imprimer un dossier ?
Si oui pouvez-vous m'indiquer la marche à suivre
merci d'avance





Avatar
fredbzr
j'ai essayé mais çà n'empêche pas l'impression, j'ai juste une boîte de
dialogue en plus
"isabelle" a écrit dans le message de news:

bonjour fredbzr,

Bonjour Isabelle
J'ai mis la macro dans le workbook et effectivement l'impression n'est
plus
possible
mais je ne peux plus faire d'aperçu



c'est un peu plus compliqué mais pas infesable,
voici une méthode jadis donné par notre grand chef à 4 plumes, le
légendaire Lucky Luke :
(ps / le tout à copier sur la page code de ThisWorkBook)


'==================================================== > Voici une nouvelle procédure qui tient compte aussi des commandes de
menu et de la boîte de dialogue "Imprimer", en plus des deux boutons de
barres d'outils (plutôt complexe, cette affaire!!!)

'==================================================== >

Private Declare Function GetAsyncKeyState Lib "User32" _
(ByVal nVirtKey As Long) As Integer


Dim Test As Boolean
Dim MCtrl As Integer


#If VBA6 Then
#Else
Private Function Recurse(CmdB As Object) As Boolean
Dim Ctrl As CommandBarControl
On Error Resume Next
Recurse = True
For Each Ctrl In CmdB.Controls
If Ctrl.Type = msoControlPopup Then
If Recurse(Ctrl) Then Exit Function
Else
For MCtrl = 0 To 1
If Ctrl.Id = Array(109, 4)(MCtrl) Then
Ctrl.Execute
If Test Then Exit Function Else Test = True
End If
Next MCtrl
End If
Next Ctrl
Recurse = False
End Function
#End If


Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim CBars As CommandBars, CmdB As CommandBar
Dim XL8 As Boolean, CtrlP As Integer
CtrlP = GetAsyncKeyState(80)
On Error Resume Next
If Test Then
Cancel = True
Else
Set CBars = Application.CommandBars
XL8 = Application.Version Like "8*"
If CtrlP Then
Test = True
Else
#If VBA6 Then
Dim Ctrl As CommandBarButton
For MCtrl = 0 To 1
For Each Ctrl In CBars.FindControls(Id:=Array(109, 4)(MCtrl))
Test = True
Ctrl.Execute
If Test Then Exit For
Next Ctrl
If Test Then Exit For
Next MCtrl
#Else
For Each CmdB In CBars
If CmdB.Visible And CmdB.Enabled Then
Test = True
Test = Recurse(CmdB)
If Test Then Exit For
End If
Next CmdB
#End If
End If
If Test And MCtrl Then
MsgBox "Boîte de dialogue ""Imprimer"""
Else
If Not Test Then
Test = True
CBars.FindControl(Id:=IIf(XL8, 2521, 109)).Execute
End If
If (Test Eqv XL8) And MCtrl Then
MsgBox "Bouton ""Imprimer"""
Else
MsgBox "Bouton ""Aperçu avant impression"""
End If
End If
End If
Test = False
End Sub


'==================================================== >

En gros, le truc consiste à simuler un clic sur chacun des contrôles de
barres d'outils ou de menu (visibles et Enabled!) qui peuvent déclencher
l'événement BeforePrint, par la méthode Execute. Si c'est le même
contrôle que celui activé par l'utilisateur, rien ne se produit, sinon
BeforePrint est automatiquement rappelé de manière récursive. La
variable Test sert à détecter si cet appel récursif a eu lieu ou non, ce
qui permet d'identifier au final quel contrôle a déclenché l'événement.
Il y a de nombreuses différences de comportement selon que ce contrôle
est dans un menu déroulant ou une barre d'outils et selon la version
d'Excel utilisée, d'où la lourdeur de la macro.


Bref, c'est hautement bidouilleux, mais ça marche apparemment très bien.


La fonction Recurse sert à parcourir toutes les commandes de menu
"Imprimer" et "Aperçu" éventuellement présentes dans les barres de menu
visibles sous Excel 97, VBA 5 ne disposant pas de la méthode
CommandBars.FindControls disponible seulement sous VBA 6.


GetAsyncKeyState sert à intercepter les Ctrl-P éventuels.


Je ne sais toujours pas comment faire en sorte que VBA détecte si
l'utilisateur a lancé soit une impression soit un aperçu à partir de la
boîte de dialogue "Imprimer". Mais ce code permet déjà d'intercepter
l'affichage de cette boîte de dialogue, et éventuellement de l'annuler,
par:


'...
If Test And MCtrl Then
MsgBox "Vous devez utiliser le bouton ""Imprimer"" de la " _
& "barre d'outils Standard.", vbInformation
Cancel = True
Else ......