Code ultime pour autoriser uniquement le collage de valeur

Bonjour au forum

Je cherche à trouver LE code ultime pour forcer le collage de valeur, que ce soit via un "copier" ou via un "couper", et quelque soit la méthode utilisée (ctrl+C, ctrl+X, clic droit, etc).

J'avais déjà écrit ce bout de code avec mes maigres connaissances, mais il ne protège pas contre le "couper" :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
On Error Resume Next 'sécurité
With Application
  If .CutCopyMode Then
    .EnableEvents = False
    .Undo
    Selection.PasteSpecial xlPasteValues
    .OnUndo "", ""
    .OnRepeat "", ""
    .EnableEvents = True
   End If
End With
End Sub

Auriez-vous des propositions ?

Merci d'avance et une très bonne journée !

bonjour,

Les UserForm sont fait pour prévus exactement pour cela !

A+

Bonjour,

Le code est très intéressant ! As tu essayé d'ajouter .CutCopyMode = xlCopy juste avant le PasteSpecial ?
D'après la doc, c'est à ce niveau que ça se joue...

Sinon, il faudrait au préalable identifier la zone copiée, par exemple via un code évènementiel lié à la sélection. Ensuite, dans ta macro actuelle, tu peux annuler le mode "couper" via un .CutCopyMode = False, puis copier la plage identifiée (plage.copy) vers la sélection (déjà présent dans le code).

Edit : salut galopin !

Bonjour

Je m'insère juste dans ce fil que je regardais pour deux petites réflexions :

- Pour avoir changé le mot TARGET en SOURCE ?
- Peut-être penser à changer la première ligne en utilisant un code sur le changement de sélection --> Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) . L'idée étant que l'opération sera effectuée dès que l'on clique sur une autre cellule. Cela rejoint un peu ce que Pedro22 suggère.

Je laisse Galopin et Pedro22 continuer avec vous sur ce fil

Cordialement

Merci pour vos suggestions !

@galopin : je ne comprends pas ton message par rapport aux USF...

@pedro : comme ceci ? car cela m'empêche de coller, mais permet quand même de couper

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
On Error Resume Next 'sécurité
With Application
  If .CutCopyMode Then
    .EnableEvents = False
    .Undo
    .CutCopyMode = xlCopy 'pedro
    Selection.PasteSpecial xlPasteValues
    .OnUndo "", ""
    .OnRepeat "", ""
    .EnableEvents = True
   End If
End With
End Sub

@Dan : Pour le Target en Source, j'ai simplement vu que dans les exemple de l'aide, c'est codé comme ceci... Peut-être une erreur de ma part ?

Concernant le Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range), j'obtiens malheureusement le même résultat.

Les UserForm sont faits pour permettre un contrôle total de la saisie utilisateur et surtout pour les empêcher d'avoir accès directement à la feuille de données. Ainsi pas moyen d'utiliser des commandes imprévues ou pas prévues pour cela...

Les Userform ne donnent accès qu'aux boutons prévus pour cela mais pas au ruban ni aux commandes de la feuille source. Mais surtout ils permettent de le faire en quelques commandes simples, là ou il faudrait plusieurs dizaines de lignes pour le faire par macros (si c'est possible, ce qui n'est pas toujours le cas...)

A+

@Dan : Pour le Target en Source, j'ai simplement vu que dans les exemple de l'aide, c'est codé comme ceci... Peut-être une erreur de ma part ?

Dans ce cas oui. Pourquoi changer ce qu'Excel a par défaut lors du choix du code et ce, d'autant que vous n'utilisez par Source dans le code.

Je cherche à trouver LE code ultime pour forcer le collage de valeur, que ce soit via un "copier" ou via un "couper", et quelque soit la méthode utilisée (ctrl+C, ctrl+X, clic droit, etc).

....

@pedro : comme ceci ? car cela m'empêche de coller, mais permet quand même de couper

En voyant le titre du sujet, votre commentaire à Pedro et votre demande, j'ai un doute sur ce que vous voulez faire quand vous dites "Forcer...". Est-ce que vous voulez interdire le copier, coller ?? ou forcer l'utilisateur à coller une valeur lorsqu'il a fait un couper ou un coller ?

Quand je vois le code avec ce que Pedro a ajouté (xlcopy), si vous faites un copier et coller ailleurs, cela efface la valeur collée

@Galopin : tout à fait juste..., mais l'idée ne m'a même pas effleurée vu la "complexité" des fichiers concernés, et surtout mes modestes compétences en VBA. Mais je garde ça en tête pour le jour où mes connaissances seront suffisantes, cela me faciliterait probablement beaucoup la tâche !

@Dan :

Dans ce cas oui. Pourquoi changer ce qu'Excel a par défaut lors du choix du code et ce, d'autant que vous n'utilisez par Source dans le code.

Effectivement, je remplacerai Source par Target, merci pour ce conseil

En voyant le titre du sujet, votre commentaire à Pedro et votre demande, j'ai un doute sur ce que vous voulez faire quand vous dites "Forcer...". Est-ce que vous voulez interdire le copier, coller ?? ou forcer l'utilisateur à coller une valeur lorsqu'il a fait un couper ou un coller ?

Je me suis probablement mal exprimé : je souhaite autoriser UNIQUEMENT le copiage et le collage de valeur. Donc empêcher de coller valeur + mise en forme, coller uniquement la mise en forme, etc. Je souhaite également interdire totalement la fonction de couper, par ctrl+x, menu, ruban, etc...

Ce code me permet de répondre en partie à ça :

Sub InterdireCouper()
  On Error Resume Next
  With Application
    'interdire le raccourci Ctrl + X
    .OnKey "^x", ""
    'interdire le couper
    .CommandBars("Edit").FindControl(ID:=21).Enabled = False
    .CommandBars("Cell").FindControl(ID:=21).Enabled = False
    .CommandBars("Column").FindControl(ID:=21).Enabled = False
    .CommandBars("Row").FindControl(ID:=21).Enabled = False
    .CommandBars("XLM Cell").FindControl(ID:=21).Enabled = False
    .CommandBars("Button").FindControl(ID:=21).Enabled = False
    .CommandBars("Formula Bar").FindControl(ID:=21).Enabled = False
    .CommandBars("Query").FindControl(ID:=21).Enabled = False
    .CommandBars("Query Layout").FindControl(ID:=21).Enabled = False
    .CommandBars("Object/Plot").FindControl(ID:=21).Enabled = False
    .CommandBars("Standard").FindControl(ID:=21).Enabled = False
    .CommandBars("Worksheet Menu Bar").FindControl(ID:=21).Enabled = False
    .CommandBars("Standard").FindControl(ID:=21).Enabled = False
  End With
End Sub

Sub RetablirCouper()
  On Error Resume Next
  With Application
    ' rétablir le raccourci Ctrl + X
    .OnKey "^x"
   ' Rétablir le couper
    .CommandBars("Edit").FindControl(ID:=21).Enabled = True
    .CommandBars("Cell").FindControl(ID:=21).Enabled = True
    .CommandBars("Column").FindControl(ID:=21).Enabled = True
    .CommandBars("Row").FindControl(ID:=21).Enabled = True
    .CommandBars("XLM Cell").FindControl(ID:=21).Enabled = True
    .CommandBars("Button").FindControl(ID:=21).Enabled = True
    .CommandBars("Formula Bar").FindControl(ID:=21).Enabled = True
    .CommandBars("Query").FindControl(ID:=21).Enabled = True
    .CommandBars("Query Layout").FindControl(ID:=21).Enabled = True
    .CommandBars("Object/Plot").FindControl(ID:=21).Enabled = True
    .CommandBars("Standard").FindControl(ID:=21).Enabled = True
    .CommandBars("Worksheet Menu Bar").FindControl(ID:=21).Enabled = True
    .CommandBars("Standard").FindControl(ID:=21).Enabled = True
End With
End Sub

mais impossible de désactiver le bouton dans le ruban...

À ce que j'ai pu lire, la seule possibilité serait d'intervenir sur le fichier XML, ce que je ne peux malheureusement pas faire au travail...

Rechercher des sujets similaires à "code ultime autoriser uniquement collage valeur"