Intersect Union

Bonjour,
lorsque j'insère quelque chose en H11 ou L11 par exemple je devrai avoir la cellule qui se colore alors qu'il ne se produit rien.
ci joint mon fichier http://www.cijoint.fr/cij452076843748.xls

merci pour votre aide

27 réponses

Résumé de la discussion

Le fil traite un problème de coloration conditionnelle en VBA lorsque des valeurs sont saisies dans H11 ou L11, mais aucune coloration ne se produit. Plusieurs réponses proposent d'utiliser des techniques de test de plage, notamment Intersect avec des unions de plages comme H11:H28 et L11:L28, et d'éviter les ajustements via des sélections. D'autres évoquent des vérifications de la valeur textuelle « 1 » versus numérique 1, et l'importance de ne pas faire sortir la logique via des sélections répétées. Des échanges soulignent qu'un Exit Sub prématuré peut bloquer la coloration lorsque la logique est répétée, et que la détection correcte passe par Target.Cells(1,1).Value et l'évitement d'erreurs liées à plusieurs cellules.

Bobot (l’IA à votre service)
  1. la transmission de pensées n'éxiste pas encore sous Windows. moi, j'ajouterais une macro pour colorié.
    1. je ne comprends pas ta réponse puisque :
      Private Sub Worksheet_Change(ByVal Target As Range)

      Dim MytargetPart1 As Range
      Dim MytargetPart2 As Range
      Dim MyBigtarget As Range
      Dim Mytargetmdp1 As Range
      Dim Mytargetmdp2 As Range
      Dim MyBigtargetmdp As Range

      Set MytargetPart1 = Union([I11], [I14], [I17], [I20], [I23], [I26], [I41], [I44], [I47], [I50], [I53], [I56], [I71], [I74], [I77], [I80], [I83], [I86], [I101], [I104], [I107], [I110], [I113], [I116])
      Set MytargetPart2 = Union([I131], [I134], [I137], [I140], [I143], [I146], [I161], [I164], [I167], [I170], [I173], [I76], [I191], [I194], [I197], [I200], [I203], [I206])

      If Intersect(Target, Union(MytargetPart1, MytargetPart2)) Is Nothing Then Exit Sub
      If Target.Offset(0, 0).Value = "X" Or Target.Offset(0, 0).Value = "x" Then Target.Offset(0, 0).Value = "X"
      If Target.Offset(0, 0).Value = "X" Then
      Target.Offset(0, -4).Resize(3, 4).ClearContents
      Target.Offset(0, 1).Resize(3, 4).ClearContents
      End If

      Set Mytargetmdp1 = Union([H11:H28], [H41:H58])
      Set Mytargetmdp2 = Union([L11:L28], [L41:L58])

      If Intersect(Target, Union(Mytargetmdp1, Mytargetmdp2)) Is Nothing Then Exit Sub
      If Target.Offset(0, 0).Value <> "" Then Target.Offset(0, 0).Interior.ColorIndex = 3

      End Sub

      je colore bien avec "Interior.ColorIndex = 3" non ?
    2. pour phil
      d'abord dans ma procédure je colorie bien la case (voir le précedent post), ensuite mon problème réside surtout dans le fait que je n'arrive pas à concretiser cela :

      Set Mytargetmdp1 = Union([H11:H28], [H41:H58])
      Set Mytargetmdp2 = Union([L11:L28], [L41:L58])

      If Intersect(Target, Union(Mytargetmdp1, Mytargetmdp2)) Is Nothing Then Exit Sub
      If Target.Offset(0, 0).Value <> "" Then Target.Offset(0, 0).Interior.ColorIndex = 3

      Si je l'esaye toute seule ca marche mais placé dans ma sub ca ne marche plus !

      merci de m'éclairer
  2. je travaille dans une banque c'est peut-être pour ça (sécurité et copagnie), pardon :(
    1. qq chose dont je me sers souvent c'est Tools --> Macro --> Record New Macro

      peut-être tu verras qu'Excel utilise un autre range
      1. merci pour ton immense aide mais editer des macros avec des conditions moi je ne sais pas faire.
        De plus si je pose des questions c'est que j'ai quand meme au préalable cherché un peu.
        Maintenant j'espérai que quelqu'un m'aide car je suis sur que pour un pro c'est du gateau
        1. Bonsoir lagodille

          Tu changerais sans doute de couleur en modifiant quelque chose dans tes zones Mytargetmdp1 ou Mytargetmdp2, mais...
          Tu as déjà fait un exit sub avant ! au niveau de la ligne If Intersect(Target, Union(MytargetPart1, MytargetPart2)) Is Nothing Then Exit Sub
          1. Je suis d'accord mais alors comment est il possible de mélanger les deux ?
            1. bien sur que si et j'ai essayé plusieurs possibilités mais sans succès et visiblement ce n'est pas si facile que cela car personne ne m'a apporté encore la bonne solution
              cordialement
              1. Il ne s'agit pas d'essayer plusieurs possibilités, la simple logique permet d'écrire directement la bonne. Il suffit d'un if-then-else

                acuellement tu as :

                if condition1 then exit sub
                traitement1
                
                préparation traitement 2
                if condition2  then
                  traitement 2
                end if

                dès que la condition 1 est remplie, le traitement 2 est sûr de ne jamais être exécuté
                il suffit de faire

                if NOT condition1 then
                  traitement1
                else
                  préparation traitement 2
                  if condition2  then
                    traitement 2
                  end if
                endif
                1. ca parait tellement simple pour toi !!!
                  bref je n'y arrive pas car je ne maitrise pas mes deux intersect
                  j'ai bien essaye ta soluce mais ca tourne au vinaigre, il y a toujours quelque chose qui cloche et je tourne en rond.
                  ca fait une semaine que je suis dessus et c'est rageant
                  bonne journée quand meme
                  1. Il ne s'agit pas de maîtriser les intersect ou tout ce qu'il y a dans les traitements. Ton problème n'est absolument pas à ce niveau.
                    Il s'agit seulement de comprendre comment le if then else endif détermine quelle partie du programme est ou n'est pas exécutée

                    Je viens d'essayer ma solution et elle marche.
                    Qu'est-ce qui selon toi cloche encore ? comment as-tu essayé de l'appliquer ? As-tu bien déterminé ce qui constituait le traitement 1, a préparation au traitement 2 et le traitement 2 ?
                    1. Private Sub Worksheet_Change(ByVal Target As Range)

                      Dim MytargetPart1 As Range
                      Dim MytargetPart2 As Range
                      Dim MyBigtarget As Range
                      Dim Mytargetmdp1 As Range
                      Dim Mytargetmdp2 As Range
                      Dim MyBigtargetmdp As Range

                      'If Not condition1 Then
                      ' traitement1
                      'Else
                      ' préparation traitement 2
                      ' If condition2 Then
                      ' traitement 2
                      ' End If
                      'End If

                      Set MytargetPart1 = Union([I11], [I14], [I17], [I20], [I23], [I26], [I41], [I44], [I47], [I50], [I53], [I56], [I71], [I74], [I77], [I80], [I83], [I86], [I101], [I104], [I107], [I110], [I113], [I116])
                      Set MytargetPart2 = Union([I131], [I134], [I137], [I140], [I143], [I146], [I161], [I164], [I167], [I170], [I173], [I76], [I191], [I194], [I197], [I200], [I203], [I206])

                      'If Intersect(Target, Union(MytargetPart1, MytargetPart2)) Is Nothing Then Exit Sub
                      If Intersect(Target, Union(MytargetPart1, MytargetPart2)) Is Nothing Then 'Exit Sub

                      Set Mytargetmdp1 = Union([H11:H28], [H41:H58])
                      Set Mytargetmdp2 = Union([L11:L28], [L41:L58])

                      If Intersect(Target, Union(Mytargetmdp1, Mytargetmdp2)) Is Nothing Then Exit Sub

                      If Target.Offset(0, 0).Value <> "" Then If Target.Offset(0, 0).Value <> "" Then UserForm3.Show

                      Else
                      If Target.Offset(0, 0).Value = "X" Or Target.Offset(0, 0).Value = "x" Then Target.Offset(0, 0).Value = "X"
                      If Target.Offset(0, 0).Value = "X" Then
                      Target.Offset(0, -4).Resize(3, 4).ClearContents
                      Target.Offset(0, 1).Resize(3, 4).ClearContents
                      End If

                      End If

                      'End If

                      End Sub

                      Plus je me penche dessus moins je vois et si j''enlève le is nothing then c'est mon intersect qui ne fonctionne plus !
                      1. ça a l'ai bien sauf que ...

                        Target.Offset(0, 0) te renvoie dans un certain nombre de cas un objet range qui fait plus d'une cellule. Dans ce cas, Target.Offset(0, 0).Value ne veut rien dire et provoqie une erreur.
                        Remplace systématiquement tous tes Target.Offset(0, 0).Value par Target.Cells(1, 1).Value (seulement ceux avec .value )

                        Remarque : Target.Offset(0, 0) veut dire la même chose que Target, ou alors explique moi la différence
                        1. Merci car enfin ca fonctionne . Je n'aurai jamais trouvé "Remplace systématiquement tous tes Target.Offset(0, 0).Value par Target.Cells(1, 1).Value " ne connaissant pas cette subtilité.
                          merci pour ton aide précieuse

                          j'ai une question subsidiaire :
                          tu as vu que j'utilisai un UserForm pour mon MDP seulement si le test MDP est mauvais, j'aimerai que le target.cells(1,1) retrouve sa valeur initiale c'est à dire "" et je ne sais pas faire

                          cordialement
                          1. ne connaissant pas cette subtilité
                            Moi non plus je ne la connaissais pas. Mais quand VBA m'a dit qu'il ne voulait pas me donner la valeur (.value) d'un range, j'ai demandé dans la fenêtre debug les éléments du range, c'est à a dire target.column, target.row, target.colums.count et target.rows.count, pour vérifier sur quel range il était en train de travailler. Quand j'ai vu qu'il y avait plusieurs cellules, le reste devenait évident.

                            Question subsidiaire : tu parles de la ligne
                            If Target.Offset(0, 0).Value <> "" Then If Target.Offset(0, 0).Value <> "" Then UserForm3.Show
                            d'abord, tu testes 2 fois , je suppose que ça vient d'une recopie malheureuse
                            partons de
                            If Target.cells(1, 1).Value <> "" Then UserForm3.Show
                            pour effacer le contenu erroné, tu as juste à faire
                            If Target.cells(1, 1).Value <> "" Then
                            Target.cells(1, 1) = ""
                            UserForm3.Show
                            endif
                            1. Oui mais à la différence près que dans ce cas quelque soit l'issue du mot de passe bon ou mauvais il me fera un remise à "" de la cellule.
                              j'ai pensé :
                              dans le userform: si mauvais MDP alors call sub qui m'insere un 1 dans une cellule dans OP1
                              puis dans le code OP1 après appel du userform , si cellule = 1 alors cell . value =""

                              mais peut etre y a t il plus simple ?

                              pascal
                              1. par rapport à mon post 18 , j'ai essayé ceci
                                If Target.Cells(1, 1).Value <> "" Then
                                UserForm3.Show
                                If Range("O1") = "1" Then Target.Cells(1, 1) = ""
                                End If

                                visiblement il ne retrouve pas mon target donc mauvaise soluce
                                1. Si Userform3 sert juste à saisir le mot de passe , tu n'en as pas besoin. Utilise la fonction inputbox

                                  If Target.Cells(1, 1).Value <> "" Then
                                  if inputbox("Entrez le mot de passe : ","MOT DE PASSE")<>"****" then
                                  Target.Cells(1, 1) = ""
                                  ( ici peut-être exit sub, ça dépende de ce que tu veux faire...)
                                  end if
                                  End If
                                  1. merci pour l'info mais je desire garder mon userform (possibilité via un admin de modifier les accès).
                                    mais peut etre que ce que je demande n'est pas possible avec un userform ?
                                    1. Si, ça peut marcher avec un Userform, je viens de faire l'essai. Le problème n'est pas là, peut être que dans ta cellule O1 tu mets la valeur numérique 1 et non pas le texte "1". Il n'y a a priori aucune raison qu'il ne retrouve pas ton target, et s'il y en a une on doit pouvoir la comprendre. Peux-tu montrer le code intéressant de UserForm3 ?
                                      Au passage, au lieu d'utiliser une cellule O1 (visible à l'écran) il vaut mieux utiliser une variable modifiée dans UserForm3 et testée dans Worksheet_Change.
                                      • 1
                                      • 2