IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Interdire Copier/Coller hors du workbook


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2006
    Messages : 108
    Par défaut Interdire Copier/Coller hors du workbook
    Bonjour,

    J'aimerais interdire le copie des données de mon workbook Excel vers un autre document (Excel , Word,...).

    J'ai donc ma sub ClearClipboard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub ClearClipboard()
        Dim oDataObject As DataObject
     
            Set oDataObject = New DataObject
            oDataObject.SetText ""
            oDataObject.PutInClipboard
     
            Set oDataObject = Nothing
    End Sub
    Je la déclenche dans Workbook_Deactivate() et Workbook_WindowDeactivate().
    Si j'ai un autre Workbook dans la même instance Excel, mon presse-papier se vide correctement.
    Si j'ai une autre instance, mon presse-papier ne se vide pas. Il ne se vide également pas si je vais dans un autre programme (Word,...).

    Est-ce qu'il y a un autre événement qui me permettrait de déclencher ma sub ?

    Note: Je veux garder la fonction copier/coller dans mon workbook. C'est pour ça que je n'ai pas implémenté une fonction qui m'interdisait de faire des copier/coller.

    Merci d'avance,
    seba_stien

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Une piste avec la démarche suivante
    1) copiez le code dans la fenêtre de code de ThisWorkbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_Activate()
    Call RunTimer(Delai:=500)
    End Sub
     
    Private Sub Workbook_Deactivate()
    Call OffTimer
    End Sub
    2) copiez le code dans un module Standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Declare Function OpenClipboard& Lib "user32" ( _
      ByVal hwnd As Long)
    Private Declare Function EmptyClipboard& Lib "user32" ()
    Private Declare Function CloseClipboard& Lib "user32" ()
    Private Declare Function GetActiveWindow& Lib "user32" ()
    Private Declare Function SetTimer& Lib "user32" _
      (ByVal hwnd As Long, ByVal nIDEvent As Long, _
      ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    Private Declare Function KillTimer& Lib "user32" _
      (ByVal hwnd As Long, ByVal nIDEvent As Long)
     
    Public OnTimer&
     
    Private Sub ClearClipBoardWinProc()
    If GetActiveWindow <> Application.hwnd Then
      OpenClipboard 0
      EmptyClipboard
      CloseClipboard
    End If
    End Sub
     
    Public Sub RunTimer(Delai&)
    If OnTimer& > 0 Then OffTimer
    OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf ClearClipBoardWinProc)
    End Sub
     
    Public Sub OffTimer(Optional dummy As Byte)
    If OnTimer& > 0 Then
      OnTimer& = KillTimer(0&, OnTimer&)
      OnTimer& = 0
    End If
    End Sub
    C'est l'activation du classeur qui déclenche l'action.
    Le principe est d'obtenir, toutes les demi secondes, le handle de la fenêtre active. Si le handle ne correspond pas à celui de l'application Excel, l'utilisateur a activé autre chose et on efface le presse-papiers.
    Malheureusement ce n'est pas la panacée car il suffit que l'utilisateur actionne un bouton ou un menu contextuel pour effacer le presse-papiers. On peut toujours utiliser le Ctrl+V pour coller dans le classeur.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2006
    Messages : 108
    Par défaut
    Bonjour,

    merci pour votre aide. Mais malheureusement, cette solution me pose quelques problèmes.

    Si je fais des copies à l'extérieur de mon workbook pour les coller à l'intérieur mon presse papier est effacé. Alors que je veux que ce soit possibble.

    J'aimerais que le pressepapier soit effacé au moment où je sors de mon workbook.

Discussions similaires

  1. interdire Copier/Coller dans un textBox
    Par marocdivers dans le forum C#
    Réponses: 1
    Dernier message: 02/06/2012, 01h38
  2. Interdire le copier/coller
    Par SheikYerbouti dans le forum Composants
    Réponses: 3
    Dernier message: 01/02/2011, 10h52
  3. interdire le copier coller (partiellement)
    Par tavarlindar dans le forum Général JavaScript
    Réponses: 35
    Dernier message: 21/05/2010, 17h16
  4. Copier des données d'un xls et coller dans le workbook
    Par baleiney dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/08/2009, 17h11
  5. Interdire de déplacier (copier-coller) un fichier ???
    Par beegees dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 15/03/2006, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo