Undo et Union Intersect [Résolu]

Signaler
Messages postés
394
Date d'inscription
mardi 5 octobre 2010
Statut
Membre
Dernière intervention
21 novembre 2020
-
Messages postés
394
Date d'inscription
mardi 5 octobre 2010
Statut
Membre
Dernière intervention
21 novembre 2020
-
Bonsoir le forum

N'étant pas fan des protections Excel de verrouillage de cellules, je préfère souvent la méthode Undo, qui autorise les copier-coller de texte.

Ici, j'aimerai appliquer cette méthode à un Range composé de plusieurs plages (via Union).
Mais Excel ne semble pas en tenir compte.

Une autre méthode consisterait à définir un Range plus global, et à exclure les 2 cellules fusionnées sur lesquelles je veux laisser l'édition libre.

Voici un fichier d'exemple avec explications : https://www.cjoint.com/c/JKst4inWvdd

Private Sub Worksheet_Selection_Change(ByVal Target As Range)
If Not Intersect(Union(Range("A1:C6"), Range("E1:H6"), Range("D1:D4"), Target)) Is Nothing Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub


Par avance merci pour votre aide !


Configuration: Windows 10 / Excel 365

8 réponses

Messages postés
23660
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 novembre 2020
6 481
Bonjour,
Worksheet_Selection_Change est une invention de ton cru qui n'existe.
Sers-toi plutôt des listes déroulantes en haut pour choisir tes événements, ils seront corrects.

Et tu vas te faire jeter aussi sur
If Not Intersect(Union(Range("A1:C6"), Range("E1:H6"), Range("D1:D4"), Target)) Is Nothing Then 

tu as mis Target dans l'union, et cherche donc à faire un Intersect avec rien...
eric

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Messages postés
394
Date d'inscription
mardi 5 octobre 2010
Statut
Membre
Dernière intervention
21 novembre 2020
9
Bonsoir Eric

Merci pour ta réponse.
OK pour le Worksheet_SelectionChange .
J'ai supprimé le Target, mais mon code est toujours sans effet :
https://www.cjoint.com/c/JKsvmPLOq1d

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Union(Range("A1:C6"), Range("E1:H6")), Range("D1:D4")) Is Nothing Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub


Je ne comprends pas pourquoi.
Merci pour la suite :)
Messages postés
23660
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 novembre 2020
6 481
Dis plutôt précisément ce que tu veux faire.
Ce n'est pas avec un code manifestement faux qu'on va deviner.
Parce que cet événement sans se servir de Target est pour le moins étrange...
eric
Messages postés
394
Date d'inscription
mardi 5 octobre 2010
Statut
Membre
Dernière intervention
21 novembre 2020
9
OK.
Je pensais que c'était clair avec le fichier joint.
Simplement, je veux protéger avec UNDO la plage A1:H6, sauf les cellules fusionnées D5 et D6.

Merci !
Messages postés
23660
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 novembre 2020
6 481
mais ça peut être un collé sur tout A1:H6 ?
Car un Undo te nettoiera aussi D5:D6...
Ou bien ce sont juste des saisies dans des cellules individuelles ?
eric

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Messages postés
394
Date d'inscription
mardi 5 octobre 2010
Statut
Membre
Dernière intervention
21 novembre 2020
9
Bonjour Eric

Ah d'accord je comprends à présent pourquoi je t'ai embrouillé.
Oublie cette histoire de copier-coller.
Simplement je veux empêcher la saisie individuelle dans A1:H6, sauf les cellules fusionnées D5 et D6.
Merci par avance
Messages postés
23660
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 novembre 2020
6 481
Bonjour,
dans ce cas :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Union([A1:C6], [D1:C3], [E1:H6])) Is Nothing Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub

eric

Messages postés
394
Date d'inscription
mardi 5 octobre 2010
Statut
Membre
Dernière intervention
21 novembre 2020
9
Oui bravo Eric !
C'était bien ça !
Ma syntaxe était inexacte.
J'avais bien vu ces crochets sur le forum, mais dans des Range nommés, du coup je pensais que ça ne s'appliquait pas à mon cas.

Parfait.
Merci beaucoup pour ton aide !
Messages postés
23660
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 novembre 2020
6 481
[A1:C6] est équivalent à Range("A1:C6"), mais il est préférable d'utiliser la seconde, celle que tu utilisais.
Ton erreur était autre, relis tranquillement
eric
Messages postés
394
Date d'inscription
mardi 5 octobre 2010
Statut
Membre
Dernière intervention
21 novembre 2020
9
Bonjour Eric

C'est vu.
Merci encore de m'avoir permis de progresser.

Bien cordialement