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
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
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
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
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
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
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
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
1 2 3
| Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.CutCopyMode = False
End Sub |
Partager