Désactiver imprime écran

aredo

XLDnaute Occasionnel
Bonjour,

J'ai un projet de gestion de stock en vba excel 2000, qui fonctionne très bien depuis plusieurs années. Le programme a été réalisé dans ce forum.
J'aurai voulu que les intervenants ne puissent accéder à la copie d'écran, pour éviter les dérives dans les stocks.
J'ai trouvé sur le net un bout de code, comment l'intégrer? qu'en pensez-vous?
Ou alors existe-t' il une méthode plus simple pour contourner une copie d'écran?

Merci au fofo
fred
 
Dernière édition:

aredo

XLDnaute Occasionnel
Re : Désactiver imprime écran

salut à tous,

merci à chacun d'enrichir la discussion et un grand merci à job pour sa ténacité. Je vais essayer d'intégrer ce bout de code. Je rappelle que le fichier fonctionne en entreprise et en réseau avec des droits d'administrateurs qui n'autorisent pas l'installation de programmes divers. Le code présent n'autorise pas l'impression, ni le copier coller. Seule la touche 'print screen' posait problème.
merci à tous
fred
 

PMO2

XLDnaute Accro
Re : Désactiver imprime écran

Bonjour,

Une piste avec la démarche suivante

1) dans la fenêtre de code de ThisWorkbook copiez le code suivant

Code:
Private Sub Workbook_Activate()
Call DeactiveImprEcran
End Sub

Private Sub Workbook_Deactivate()
Call ReactiveImprEcran
End Sub

2) dans un module standard copiez le code suivant

Code:
Declare Function RegisterHotKey& Lib "user32" ( _
  ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long)
Declare Function UnregisterHotKey& Lib "user32" (ByVal hWnd As Long, ByVal id As Long)
  
Private Const MOD_UNMODIFIED = &H0
Private Const MOD_ALT = &H1
Private Const MOD_CONTROL = &H2
Private Const MOD_SHIFT = &H4
  
Sub DeactiveImprEcran(Optional dummy As Byte)
RegisterHotKey Application.hWnd, &HBFFF&, MOD_UNMODIFIED, vbKeySnapshot
RegisterHotKey Application.hWnd, &HBFFE&, MOD_ALT, vbKeySnapshot
RegisterHotKey Application.hWnd, &HBFFD&, MOD_CONTROL, vbKeySnapshot
RegisterHotKey Application.hWnd, &HBFFC&, MOD_SHIFT, vbKeySnapshot
End Sub
 
Sub ReactiveImprEcran(Optional dummy As Byte)
UnregisterHotKey Application.hWnd, &HBFFF&
UnregisterHotKey Application.hWnd, &HBFFE&
UnregisterHotKey Application.hWnd, &HBFFD&
UnregisterHotKey Application.hWnd, &HBFFC&
End Sub


A chaque activation du classeur l'imprime écran est désactivé.
Dès que le classeur est désactivé l'imprime écran retrouve sa fonction.

Cordialement.

PMO
Patrick Morange
 

aredo

XLDnaute Occasionnel
Re : Désactiver imprime écran

bonjour,

La méthode de job fonctionne parfaitement, c'est vraiment ce que je voulais. Merci à Patrick également, la touche est désactivée, mais permet toujours le copier-coller.
Vous êtes vraiment des pros, çà fait toujours plaisir de venir ici. Merci encore au fofo
bonne continuation.
fred
 

aredo

XLDnaute Occasionnel
Re : Désactiver imprime écran

Bonjour,


Depuis le rajout du code (en rouge ds Thisworkbook) puis le module 7, Le fichier bug en fermant.
Le fichier se ferme normalement au bout d’un temps défini(lorsque l’utilisateur ne saisit plus), en sauvegardant. Avec le rajout du code, après le temps défini, le fichier se ferme, mais il affiche l’Usf 6, (USFuser), celui qui s’affiche en premier en ouvrant le fichier.
On dirait qu’il y a conflit avec la fonction ‘ApplicationOnTimeNewTimer’
Ce n’est sans doute pas grand chose, mais je ne vois pas quel terme exact du code pose problème.
Est-ce quelqu’un a une idée ?

Autre chose. Dans le fichier actuel, une macro ‘protège/déprotège’ permet à certains utilisateurs de rentrer des données sur les feuilles. On se sert de la feuille ‘users’ pour contrôler cet état.

J’aimerai faire la même chose avec le code de Job75, autoriser certaines personnes à se servir ou non de la touche imprime écran. Que faut’ il modifier ?
Le fichier se finalise vraiment et c’est grâce à vous. J’espère que vous saurez donner une suite à cette demande.
A bientôt
Fred

Le code complet comprend 6 Usf et 7 modules dont le dernier.
Le fichier est joint ds le 1er message.
Ci-joint code thisworkbook et module 1 et 7

Thisworkbook

Code:
Option Explicit
-----------------------------------------------------------------------------------
Private Sub Workbook_Activate()
Application.OnKey "%{F8}", ""
ControleImage
End Sub
-----------------------------------------------------------------------------------
Private Sub Workbook_Deactivate()
Me.Worksheets(1).[IV1].Copy 'vide le presse-papier
Application.CutCopyMode = False
Application.OnTime t, "ControleImage", , False
End Sub
------------------------------------------------------------------------------------
Private Sub Workbook_Open()
Dim CmdB As CommandBar
For Each CmdB In Application.CommandBars
Application.CommandBars("Worksheet Menu Bar").Enabled = False
Next CmdB

Call InterdireCopierCouper

Dim lgDerLig As Long
  'Sur timer de 15 secondes, on ferme l'appli
  NewTimer = Time() + TimeValue("00:13:20")
  Application.OnTime NewTimer, "CloseSurTimer"
  USFuser.Show
  ' Si aucun nom n'a été saisi, on quite l'appli
  If NomUtil = "" Then ThisWorkbook.Close
   ' Sauvegarder le nom de l'utilisateur et la date de connexion
    With Worksheets("Connexion")
        .Visible = True
        lgDerLig = .Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
        .Range("A" & lgDerLig).Value = NomUtil
        .Range("B" & lgDerLig).Value = Format(Date, "dddd d mmm yyyy")
        .Range("C" & lgDerLig).Value = Time()
        .Visible = False
    End With
    ' sinon on continue
    'Récupère la propriété du classeur si lecture seule
    WbkRO = ThisWorkbook.ReadOnly
  'Load UserForm1 'cela doit être enlevé car UserForm1.Show effectue le load
  UserForm1.Show
  bProtect = False
End Sub
------------------------------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'enregistre en quittant
     Dim CmdB As CommandBar
For Each CmdB In Application.CommandBars
CmdB.Enabled = True
Next CmdB

Call RetablirCopierCouper
       
Dim intWS As Integer
    'Si le classeur n'est pas en lecture seule
    If WbkRO = False Then
    ' Si la déprotection/protection est autorisée
    If varProtect = True And bProtect = True Then
        ' Boucle sur toutes les feuilles du classeur
        For intWS = 1 To ThisWorkbook.Worksheets.Count
            If Sheets(intWS).Name <> "historiq" And Sheets(intWS).Name <> "Users" _
                And Sheets(intWS).Name <> "Connexion" Then
                
                ' Protection de la feuille
                Sheets(intWS).Protect Password:=MdP, DrawingObjects:=True, Contents:=True, Scenarios:=True
            End If
        Next intWS
    End If
ActiveWindow.DisplayWorkbookTabs = False
    ThisWorkbook.Save
End If
Application.DisplayAlerts = True
End Sub
---------------------------------------------------------------------------------------------------------------
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  Dim icbc As Object
  ' Sort de la procédure si le nombre de cellule >1
  If Target.Count > 1 Then Exit Sub
  ' Si l'utilisateur n'est pas sur la bonne feuille
  If InStr(1, "stock historiq Connexion références Users", Sh.Name, vbTextCompare) > 0 Then
    For Each icbc In Application.CommandBars("cell").Controls
      If icbc.Tag = "brccm" Then icbc.Delete
    Next icbc
    Exit Sub
  End If
  ' Sinon on continue
  xnomfeuil = Sh.Name
  reference = Target.Value
  ' Vérifier sur quelle colonne l'utilisateur se trouve
  If Target.Column <= 4 Or Target.Column = 9 Then
    For Each icbc In Application.CommandBars("cell").Controls
      If icbc.Tag = "brccm" Then icbc.Delete
    Next icbc
              
    With Application.CommandBars("cell").Controls _
      .Add(before:=5, temporary:=True)
      .Caption = "Visualisation quantité"
      .OnAction = "affiche4"
      .Tag = "brccm"
    End With
  Else
    For Each icbc In Application.CommandBars("cell").Controls
      If icbc.Tag = "brccm" Then icbc.Delete
    Next icbc
  End If
End Sub
----------------------------------------------------------------------------------------------------------
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  On Error Resume Next
  ' Un changement à été effectué, on annule le précdent timer
  Application.OnTime NewTimer, "CloseSurTimer", Schedule:=False
  ' Sur timer de 15 secondes, on ferme l'appli
  NewTimer = Time() + TimeValue("00:13:20")
  Application.OnTime NewTimer, "CloseSurTimer"
  On Error GoTo 0
End Sub
-------------------------------------------------------------------------------------------------------------
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim sFeuille As String
Cancel = True
sFeuille = ActiveSheet.Name
If ActiveSheet.Name <> Sh5.Name Then
MsgBox "Vous n'avez pas le droit d'imprimer ce document"
Exit Sub
Else
Application.EnableEvents = False
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Application.EnableEvents = True
End If
End Sub


MODULE 1

Global NomUtil As String
Global varProtect As Boolean
' <<< Modif le 23/12
Global bProtect As Boolean
' >>> Modif le 23/12
Global WbkRO As Boolean ' Définir dans cette variable si le classeur est en lecture seule
Global NewTimer
-----------------------------------------------------------------------------------------------------------
Sub Affiche()
    'Load UserForm1 ' il est inutile d'effectuer un load avant un show de la feuille
    UserForm1.Show
End Sub
-----------------------------------------------------------------------------------------------------------
Public Sub DeprotegeProtege()
    ' <<< Modif le 23/12
    If varProtect = True Then UserForm5.Show vbModal
    ' >>> Modif le 23/12
End Sub
-----------------------------------------------------------------------------------------------------------
Public Sub CloseSurTimer()
 Application.DisplayAlerts = False
  If WbkRO = True Then
  ThisWorkbook.Close SaveChanges:=False
  Else
  ThisWorkbook.Close SaveChanges:=True
  End If
End Sub

MODULE 7

Public t As Date
Sub ControleImage()
Dim a As String
ThisWorkbook.Worksheets(1).[IV1].Copy 'vide le presse-papier
Application.CutCopyMode = False
On Error Resume Next
a = Selection.Address
If Err Then Selection.Delete
t = Now + 1 / 86400
Application.OnTime t, "ControleImage"
End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Désactiver imprime écran

Bonjour aredo, salut James,

Je ferai juste 2 remarques.

1) Pour alléger votre code (bien lourd...) vous pouvez supprimer les macros InterdireCopierCouper et RetablirCopierCouper.

En effet la méthode que j'ai donnée empêche comme je l'ai dit tout collage.

2) Dans la macro BeforeClose il faut mettre :

Application.OnTime NewTimer, "CloseSurTimer", Schedule:=False

Sinon quand on arrive à l'instant défini par NewTimer le fichier se rouvre pour exécuter la macro "CloseSurTimer".

Et alors bien sûr la macro Workbook_Open ouvre l'UserForm1...

Pour les histoires de droits Administrateur, accrochez-vous, car je reconnais que c'est assez casse-pieds.

A+
 

aredo

XLDnaute Occasionnel
Re : Désactiver imprime écran

bonsoir,

Ok, j'ai remis les balises.
Merci job pour ton suivi. Effectivement, il doit y avoir quelques lourdeurs ds le code, car il a été modifié à maintes reprises.
Je modifie dès demain. Pour le reste, je vais essayer de potasser!
bonne soirée
fred
 

aredo

XLDnaute Occasionnel
Re : Désactiver imprime écran

bonsoir,

Juste une question pour Job s'il est tjrs sur le fil. Est-ce qu'il y a possibilité de modifier ce code (le vôtre) sous forme de macro que l'on pourrait déclencher à souhait ? Quels seraient les changements éventuels ?
bon wkend
fred
 

aredo

XLDnaute Occasionnel
Re : Désactiver imprime écran

Bonjour,

En fait le problème persiste.
Dans la macro BeforeClose il faut mettre :

Application.OnTime NewTimer, "CloseSurTimer", Schedule:=False

Sinon quand on arrive à l'instant défini par NewTimer le fichier se rouvre pour exécuter la macro "CloseSurTimer".

Et alors bien sûr la macro Workbook_Open ouvre l'UserForm1...

En fermant au bout du temps défini, le fichier se rouvre et affiche donc l'usfuser.


Qu'en pensez-vous?
merci à tous
 
Dernière édition:

aredo

XLDnaute Occasionnel
Re : Désactiver imprime écran

bonjour,

Apparemment job n'est plus sur le fil, dommage. Si qqu'un se sent capable de m'aider. Je résume. Depuis le rajout du code de job qui annule tout possibilité de copier coller, ainsi que l'utilisation de la touche print screen, çà bug en fermant.
Dans mon code, j'ai une fonction timer qui au bout d'un temps défini ferme l'application. Sinon, quand je ferme normalement, tout fonctionne.
voici ce que me dit la fonction débogage:


Le code thisworkbook est en haut de cette page.
merci au fofo
fred
 

job75

XLDnaute Barbatruc
Re : Désactiver imprime écran

Bonjour aredo,

Il y a bug sur :

Application.OnTime NewTimer, "CloseSurTimer", Schedule:=False

quand il n'y a plus rien en instance pour le temps NewTimer.

Essayez tout simplement avec :

On Error Resume Next
Application.OnTime NewTimer, "CloseSurTimer", Schedule:=False


A+
 

aredo

XLDnaute Occasionnel
Re : Désactiver imprime écran

bonjour job,

J'ai rajouté 'On Error Resume Next' avant la fonction timer dans BeforeClose, toujours pareil! Il n'y a plus le message d'erreur, mais usfuser se déclenche malgré tout!
merci d'avoir repris le message
bon wkend
fred
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Désactiver imprime écran

Re,

Je me suis rendu compte que Workbook_Deactivate ne se déclenche pas avec l'instruction Close...

Donc à la fin de la macro Workbook_BeforeClose écrire :

On Error Resume Next
Application.OnTime t, "ControleImage", Schedule:=False
Application.OnTime NewTimer, "CloseSurTimer", Schedule:=False


Mais déclarez aussi NewTimer variable Public, en haut de Module7 je crois :

Public t, NewTimer

Cela devrait régler le problème :)

A+
 

Statistiques des forums

Discussions
312 488
Messages
2 088 835
Membres
103 972
dernier inscrit
steeter