Modifier la valeur d'une cellule en cliquant droit ou double cliquant

Bonjour à tous.

Je souhaite écrire une macro qui permet de modifier le contenu d'une cellule rien qu'en double cliquant ou en cliquant droit dessus.

Le changement n'est pas énorme (OUI --> NON et NON --> OUI).

J'ai récupéré le code ci dessous :

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Application.EnableEvents = False
With Target
    If .Address = Range("O2").Address Then
        Select Case .Value
            Case "NON"
                .Value = "OUI"
            Case "OUI"
                .Value = "NON"
        End Select
    End If
End With
Application.EnableEvents = True
End Sub

Comme vous le voyez ci dessous, il n'y a que la cellule O2 qui est concernée pour l'instant.

Mais ce code ne fonctionne pas pour l'instant.

De plus, le "Cance As Boolean", qui est sensé annuler la fenêtre contextuelle du clic droit, ou la modification de la cellule d'un double clic, ne fonctionne pas non plus.

Et comment faire si je souhaite définir d'autres cellules comme ayant la même fonctionnalité sur la même feuille (Ajouter la cellule M2 en plus de O2 par exemple) ?

Merci d'avance pour vos réponses.

Cordialement,

Onafe57

Bonjour,

Une proposition :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim Liste()
Liste = Array("$M$2", "$O$2", "$Q$2") 'A adapter selon les cellules à gérer

With Target
    If Appartient(.Address, Liste) Then
        Cancel = True
        Select Case .Value
            Case "NON"
                .Value = "OUI"
            Case "OUI"
                .Value = "NON"
        End Select
    End If
End With

End Sub
Private Function Appartient(AddressCel As String, AddressList()) As Boolean

Dim Addr, Res As Boolean

For Each Addr In AddressList
    If Addr = AddressCel Then 
        Res = True
        Exit For
    End If
Next Addr
Appartient = Res

End Function

PS : on peut peut-être se passer de ma fonction perso grâce à la fonction Intersect, que je ne maîtrise malheureusement pas suffisamment.

Bonjour Pedro.

Merci pour ta réponse.

Je testerais ça dès demain matin.

Peux tu simplement me préciser l'utilité et le fonctionnement de la fonction "appartient" ?

Ça me permettra de mieux l'adapter dans mon outil.

Merci d'avance.

Onafe57.

Bonjour toutes et tous

merci et coucou à Pedro

@Onafe57

Je pense que Pedro t'as fait une fonction personnalisée 'Appartient"

en regardant bien ==> : " Private Function Appartient(AddressCel As String, AddressList()) As Boolean

etc

pour le fonctionnement Pedro sera mieux dire que moi merci à lui

crdlt,

André

Salut Onafe57,

Salut l'équipe,

plus simple...

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'
Cancel = True
Application.EnableEvents = False
'
If Not Intersect(Target, Union(Range("O2"), Range("M2"))) Is Nothing Then Target.Value = IIf(Target.Value = "OUI", "NON", "OUI")
'
Application.EnableEvents = True
'
End Sub

A+

Salut Onafe57, Andre13 et curulius57 !

@Onafe57, comme l'a dit Andre13, "Appartient" est une fonction personnalisée dont l'objectif est de renvoyer "VRAI" si une adresse de cellule appartient à une liste d'adresses (les 2 arguments de la fonction).

Comme indiqué dans ma réponse, j'imaginais qu'il était possible d'utiliser la fonction existante "Intersect", que je n'ai pas proposé faute de savoir l'écrire correctement pour ton cas. C'est ce que t'as brillamment proposé curulius57 !

@curulius57 : jolie proposition !

Mais ne faudrait il pas inclure l'instruction "Cancel = True" dans la structure "If" ? Ceci éviterai l'annulation systématique du double clique (hors de la plage souhaitée), sauf erreur de ma part.

Bonjour à tous.

Superbe, ça marche !

Merci à tous pour votre réponse collective.

Je confirme la proposition de Pedro22. Le "Cancel = True" doit bien se situer dans le bloc "If" pour qu'il ne soit actif que sur la cellule que l'on cherche à modifier.

Sinon, c'est toute la feuille qui est impactée, et le clic droit devient inactif partout.

Problème résolu !

Sinon, pour ma culture personnelle, je ne connaissais pas le :

IIf(Target.Value = "OUI", "NON", "OUI")

Pouvez vous m'en dire plus ? Comment il se construit ?

Ça ressemble à une fonction If simplifiée à première vue.

Encore merci !

Onafe57

Salut Onafe57,

IIF = Immediate IF => Si ( X=1; alors X=2; sinon X=3)

Attention : les deux propositions (X=2; X=3) doivent être VRAIES dans tous les cas de figure!

Ici, c'est simple à comprendre, évidemment mais, selon les circonstances, une proposition pourrait être FAUSSE ce qui provoquerait une erreur, t'obligeant alors à utiliser la forme habituelle IF... THEN...ELSE.

A+

Rechercher des sujets similaires à "modifier valeur cliquant droit double"