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

Contribuez Discussion :

bloquer le copier coller 36 manieres différentes


Sujet :

Contribuez

  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut bloquer le copier coller 36 manieres différentes
    Bonjours a tous
    BLOQUER LE COPIER/COLLER
    cette question a été tres souvent posé sous diverses formes
    je vous propose aujourd'hui un éventail des possibilités afin qu'une prochaine fois que quelqu'un se pose la question il y trouvera peut être son bonheur

    tout d'abords que peut on faire

    1°bloquer l'item"copier " et l'item "coller" du menu (solution efficace néanmoins radicale) d'autant plus que selon les besoins il faut les débloquer :oui!! mais quand et comment entrainerait une gestion d'évènement dans le sheets très tortueuse
    cette logique devra donc être adapté au cas par cas

    2°vider le presse papier

    3°mettre les valeurs de la cellule sélectionnée dans le clip board ainsi l'ors du coller la valeur reste la même, oui sauf que si il y a une formule dans la cellule ca valeur sera figée c'est ballo hein!!! alors mettre la formule dans le clip board

    voila les 3 principales idées a développer

    comment accéder au clip board
    la encore on peut y acceder de différentes manieres
    commençons par l'exemple le plus rependu avec les apis Windows
    déclarations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "user32" () As Long
    Private Declare Function CloseClipboard Lib "user32" () As Long
    ses fonction de l'api user32 dans l'ordre sont respectivement ouverture,vidage,fermeture

    on peut s'en servir comme cela dans l'evenement selection_change du sheets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    OpenClipboard 0
    EmptyClipboard
    CloseClipboard
    End Sub
    on constate des l'ors que si l'on veut coller , l'item "coller" du menu est grisé( inactif) normal il n'y a plus rien a coller
    un seul petit probleme qui peut etre un vrai calvere pour les non initiés c'est que les api selon les versions de window peuvent jouer des vilains tours
    contraintes de double declarations pour 64/32 bits
    souvent avec W8 le presse papier ne se vide pas
    et que sais-je encore
    tournons nous donc a ce que excel et vba propose
    nous avons la fonction putinclipboard de l'object dataobject de microsoft donc la reference microsoft forms x.x object library
    probleme sur 2007 cette reference n'est pas listée
    pour ajouter cette reference il faut ajouter un userform si le fichier n'en a pas deja un voir le supprimer tout de suite si il est inutile
    nous avons aussi l'object htmldocument de la librairie de internet explorer qui propose dans ces fonctions l'acces au clipboard en lecture et ecriture

    mon préféré reste l'object htmldocument les gouts et les couleurs ne se discutent pas

    nous allons donc commencer par cet object
    je vais travailler en latebinding( laison tardive) afin de ne pas avoir a activer de reference a fin de rendre la chose le plus universel possible
    voici un exemple
    ici je vide le clipboard avec la fonction cleardata du .parentwindow.clipboardData de l'object
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text"): End With
    End Sub
    efficace oui!!!
    ici comme avec les api l'item "coller" est grisé(inactif)

    voyons les chose autrement

    et plutot que de vider le clipboard on y mettait la formule
    en voila une idée qu'elle est amusante

    on utilsera donc pas la fonction cleardata mais setdata de cet object
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       With CreateObject("htmlfile").parentwindow.clipboardData.setData("Text", Target.Formula): End With
    End Sub
    a ben voila je me retrouve donc toujours avec ma cellule et sa valeur donc sa formule tout va bien pour le meilleur des mondes sans meme bloquer le "copier/coller"



    voyons un peu maintenant l'object qui est a notre dispo dans VBA

    le dataobject


    nécessite l'activation de la reference "microsoft forms 2.0 object Library"
    l'idée de départ n'est pas de moi mais le membre unparia que je propose de 2 facons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Dim toto As New DataObject
      toto.SetText ""
      toto.PutInClipboard
    End Sub
    alors de cette maniere on n'empeche pas le copier coller mais ce qui est collé est null (vide,rien,nada,etc..)
    c'est balo!!! on a perdu la valeur et!! la formule cela dit encore une fois selon votre besoins ,ca peut être suffisant

    tres bien procedont autrement mettons la formule en clipboard comme avec mon object fetiche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'necessite l'activation de la reference "microsoft forms 2.0 object library"
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Dim toto As New DataObject
       toto.SetText Target(1).Formula
      toto.PutInClipboard
    End Sub
    a ben voila on garde notre cellule intacte sans bloquer le "copier/coller"

    activer la reference vous avez dis ?

    pas forcement!! faisons la meme chose en late binding (declaration tardive )pour les pc Windows


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange1(ByVal Target As Range)
        With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText Target.Formula: .PutInClipboard: End With
    End Sub
    et voila c'est la meme chose sans references activées
    on dit que les developpeurs sont fainéants je vais finir par le croire
    conclusion
    selon votre besoins vous pouvez utiliser une methode ou une autre
    en tout cas maintenant vous savez comment faire
    et histoire de rire de nous

    car il est pas venu le jour ou la question ne sera plus posé
    une méthode simple qui devrait être connu de tous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.CutCopyMode = False
    End Sub

  2. #2
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 519
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 519
    Points : 16 451
    Points
    16 451
    Par défaut
    Bonjour

    Suite à la lecture de ton post, je viens de revérifier l'application que j'avais faite en 2006 où j'avais cette problématique et j'avais utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Application.CutCopyMode = False
            Application.CellDragAndDrop = False
    afin d'éviter la copie aussi par glisser déplacer...

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    salut chris

    met ton code dans ta feuille concerné laisse ouvert ton classeur et ouvre un fichier text ou word ou ce que tu veux et copie un texte
    reviens sur excel et colle
    regarde comme ton cutcopymode=false c'est du walouh walouh

  4. #4
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 519
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 519
    Points : 16 451
    Points
    16 451
    Par défaut
    Bonjour

    C'est justement la question que je me posais en envoyant mon post précédent : ça ne marche sûrement pas entre applis. Tu me donnes la réponse, donc c'est OK

    A l'époque où j'ai fait ce truc, le risque était surtout d'Excel à Excel donc je ne m'étais pas trop méfié des autres applis.

    En revanche je me méfiais des copies souris...

    En tout cas merci de ta contribution car la question revient souvent et c'est bien d'avoir ta synthèse .

  5. #5
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour Patrick,

    Peut-être conviendrait-il de préciser que tes méthodes ne fonctionnent que sur une seule feuille.
    Tu bloques juste l'action de copier/coller sur la même feuille.
    Si l'on veut bloquer ce système sur le classeur, il convient de passer par l'événement Change() et la commande Undo...

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour pijaku

    il y a le même évènement dans le module thisworkbook aussi qui peut le faire pour toute les feuilles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    End Sub
    après comme je l'ai dis plus haut , tout dépend du besoins reel

    ce qui est intéressant ici dans cette synthèse se sont les méthodes qui selon celle employée peut être dans une macro pour
    des besoins plus complexe

    j'aurais pu parler du bloquage de l'item du menu aussi parmi tant d'autre choses mais c'est avant tout une contrib sur le clipboard et sa manipulation

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Novembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 64bit
    Bonjour,
    En 64bit il faut déclarer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
    Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 83
    Points
    83
    Par défaut
    Bonjour à tous,

    Je déterre ce post qui est très bien fait. J'ai voulu utiliser l'object htmldocument qui semble simple et efficace, sauf que lorsque je sélectionne 2 cellules j'ai le message d'erreur :

    Nom : Capture d’écran 2022-06-20 164021.jpg
Affichages : 2404
Taille : 14,8 Ko

    Quelqu'un a une idée?

    Merci

Discussions similaires

  1. [XL-2007] Bloquer "copier - coller"
    Par firecarl dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/03/2017, 10h50
  2. Réponses: 3
    Dernier message: 03/09/2014, 15h16
  3. Réponses: 17
    Dernier message: 29/06/2009, 10h47
  4. Copier Coller massif sur différents fichiers ?
    Par zephirsoul dans le forum Excel
    Réponses: 1
    Dernier message: 22/12/2007, 23h33
  5. Réponses: 7
    Dernier message: 15/02/2006, 15h12

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