Undo et Union Intersect

Résolu
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

  1. Contributeur
    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

    1
    1. 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 :)
      0
      1. Contributeur
        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
        0
    2. 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 !
      0
      1. Contributeur
        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

        0
        1. 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
          0
          1. Contributeur
            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

            0
            1. 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 !
              0
              1. Contributeur
                [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
                0
            2. Bonjour Eric

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

              Bien cordialement
              0