Intersect Union

lagodille Messages postés 99 Statut Membre -  
lagodille Messages postés 99 Statut Membre -
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

  • 1
  • 2
  1. phil232 Messages postés 610 Statut Membre 178
     
    la transmission de pensées n'éxiste pas encore sous Windows. moi, j'ajouterais une macro pour colorié.
    0
    1. gildautal Messages postés 16 Statut Membre 3
       
      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 ?
      0
    2. lagodille Messages postés 99 Statut Membre 4
       
      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
      0
  2. phil232 Messages postés 610 Statut Membre 178
     
    je travaille dans une banque c'est peut-être pour ça (sécurité et copagnie), pardon :(
    0
  3. phil232 Messages postés 610 Statut Membre 178
     
    qq chose dont je me sers souvent c'est Tools --> Macro --> Record New Macro

    peut-être tu verras qu'Excel utilise un autre range
    0
  4. lagodille Messages postés 99 Statut Membre 4
     
    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
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. le père
     
    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
    0
  7. lagodille Messages postés 99 Statut Membre 4
     
    Je suis d'accord mais alors comment est il possible de mélanger les deux ?
    0
  8. le père
     
    tu ne connais pas
    if.. then
    else
    endif
    ?
    0
  9. lagodille Messages postés 99 Statut Membre 4
     
    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
    0
  10. le père
     
    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
    0
  11. lagodille Messages postés 99 Statut Membre 4
     
    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
    0
  12. le père
     
    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 ?
    0
  13. lagodille Messages postés 99 Statut Membre 4
     
    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 !
    0
  14. le père
     
    ç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
    0
  15. lagodille Messages postés 99 Statut Membre 4
     
    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
    0
  16. le père
     
    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
    0
  17. lagodille Messages postés 99 Statut Membre 4
     
    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
    0
  18. lagodille Messages postés 99 Statut Membre 4
     
    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
    0
  19. le père
     
    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
    0
  20. lagodille Messages postés 99 Statut Membre 4
     
    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 ?
    0
  21. le père
     
    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.
    0
  • 1
  • 2