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. bonjour
    je remercie tout particulièrement "le père" pour son aide et sa patience vis à vis du néophite que je suis.
    L'on progresse beaucoup plus rapidement de cette manière et des fois, meme avec l'aide VB , on a du mal à trouver les bonnes infos
    cdlt
    1. nos post se sont croisés je pense car j'ai précisé dans le post 26 que j'avais trouvé pour la croix
      merci de la lire
      cdlt
      1. Non, mais j'ai mis 30 s à le trouver dans l'aide de VBA

        Il FAUT lire les aides de VB

        Private Sub UserForm_QueryClose(cancel As Integer, closemode As Integer)

        La syntaxe de l'événement QueryClose comprend les éléments suivants :

        ...
        closemode Valeur ou constante indiquant la cause de l'événement QueryClose.
        ...
        vbFormControlMenu 0 L'utilisateur a choisi la commande Fermeture dans le menu Système placé sur l'objet UserForm.
        vbFormCode 1 L'instruction Unload est appelée à partir du code.
        VbAppWindows 2 La session courante dans l'environnement d'exploitation Windows est en train de s'achever. (Visual Basic 5.0 uniquement.)
        VbAppTaskManager 3 Le Gestionnaire de tâches de Windows est en train de fermer l'application. (Visual Basic 5.0 uniquement.)

        En pratique, tu es entre les cas 0 ou 1
        1. j'ai trouvé la soluce pour la croix donc mes problèmes sont résolus.
          http://www.cijoint.fr/cij2099633131150.xls

          néanmoins dans un post tu as dis :

          "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."

          peux tu me faire un topo sur ca pour que j'essaye d'améliorer mon fichier ?

          merci d'avance
          1. bon eh bien je suis arrivé à faire fonctionner l'ensemble comme souhaité .
            un seul détail mais je ne connais pas la commande c'est lorsque j'appelle mon userform et dans le cas ou je veux le fermer par la croix je ne reinitialise pas ma cellule à "".
            Sais tu à quelle commande l'on fait appel quand on clique sur la croix ?
            cordialement
            pascal
            1. ma cellule O1 n'est pas réinitialisée à "vide" à chaque fois

              Ben ... réinitialise la !

              Au passage, évite d'utiliser des "select" à tour de bras :
              Sheets("OP1").Select
              Range("O1").Select
              ActiveCell.FormulaR1C1 = "1"

              C'est bien long alors que Sheets("OP1").Range("O1") = "1" suffit.
              1. voici mon fichier http://www.cijoint.fr/cij10954421421105.xls
                MDP = ADMIN et ADMIN
                donc si bon mot de passe ce que j'ai inseré dans la cellule H11(par exemple) reste sinon si mauvais mot de passe on efface ce qu'il y a dans la cellule concernée

                mef ma cellule O1 n'est pas réinitialisée à "vide" à chaque fois
                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. 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 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. 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. 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. 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. 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. ç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. 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. 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. 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 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. 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
                                          • 2