Macro avec cellule de mise en forme conditionnelle

Résolu
Saucisson_47 Messages postés 11 Statut Membre -  
Saucisson_47 Messages postés 11 Statut Membre -
Bonjour,

Je ne suis pas un expert en macro (je me contente de reprendre des macros sur internet que j'adapte à mon besoin...) mais là, malgré pas mal de recherches, je n'arrive pas à solutionner mon problème..
Je souhaite taper dans mes cellules A38 à A59 un nom (dans mon exemple : A43 = "RTT") et de lui affecter un code couleur (exemple : orange). Ce code couleur s'applique à la plage de cellules A5:AK35. Cela fonctionne bien lorsque que dans ma plage A5:AK35 la cellule est vide et que je tape "RTT" ou si je rentre dans chaque cellule et que je fais "entrée". Mon souci arrive lorsque je souhaite changer de code couleur pour mes cellules qui contiennent RTT : si je change la couleur de ma cellule A43, les cellules contenant RTT dans ma plage A5:AK35 ne changent pas de couleur (elles restent orange)... Il faut que je rentre dans chacune d'elles pour que la couleur évolue...
J'ai essayé les fonctions calculate, application.volatile, enablecalculation mais cela ne fonctionne pas ou je les ai mal placées.
J'ai aussi essayé d'affecter dans le premier range uniquement la plage A5:AK35 mais le résultat est le même...

J'ai inséré le code suivant que j'ai mis dans ma feuille concernée.

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Then Exit Sub
If Not Application.Intersect(Target, Range("A38:A59,A5:AK35")) Is Nothing Then
If Target.Value = Range("A43") Then
Target.Interior.Color = Range("A43").Interior.Color

ElseIf Target.Value = Range("A39") Then
Target.Interior.Color = Range("A39").Interior.Color

ElseIf Target.Value = Range("A42") Then
Target.Interior.Color = Range("A42").Interior.Color

ElseIf IsNumeric(Target.Value) And Target.Value <> "" Then
Target.Interior.Color = Range("A38").Interior.Color
Else
Target.Interior.Color = xlNone
End If
End If

End Sub

Pouvez-vous m'aider de manière à ce que la couleur change toute seule sans avoir à repasser cellule par cellule...

Merci par avance

Cdt

Mathieu

6 réponses

  1. Saucisson_47 Messages postés 11 Statut Membre
     
    Bonjour et merci Frenchie pour votre réponse.
    En fait, c'est presque ça. Il me faudrait un mix de ma macro initiale et de la vôtre... Seulement, il me faudrait du dynamisme dans les saisies effectuées dans les cellules A38:A59.
    En résumé, il me faudrait une plage de légende évolutive (la base de légende étant A38:A59) sur les saisies et sur les couleurs qui s'appliquerait sur ma plage A5:AK35

    Dans cette plage de cellules (A38:A59), je peux écrire RTT, CA, CT, etc... Mais demain je pourrai changer et mettre Pierre Paul Jacques à la place et intervertir les couleurs. Je retrouve ces différentes possibilités dans ma plage A5:AK35. Je souhaite donc colorer les différents éléments notés dans ma plage A5:Ak35 de la même couleur que celle définie dans ma plage A38:A59 et aussi qu'il y ait la possibilité de changer la couleur de base dans cette plage A38:A59

    Merci par avance pour votre réponse
    0
  2. Frenchie83 Messages postés 2254 Statut Membre 339
     
    Bonjour
    Ceci devrait aller
    Dans le module "Matrice"
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Count > 1 Then Exit Sub
        If Not Intersect(Target, Range("A38:A59")) Is Nothing Then
            Coul = Target.Interior.Color
            Valeur = Target
            Appliquer
        End If
    End Sub
    

    Dans le module 1
    Public Coul As Long
    Public Valeur As String
    
    Sub Appliquer()
        For Each cell In Range("A5:AK35")
            If cell.Value = Valeur Then cell.Interior.Color = Coul
        Next
    End Sub

    Cdlt
    0
    1. Saucisson_47 Messages postés 11 Statut Membre
       
      Bonjour et merci,
      Cela fonctionne chez vous sur le fichier que je vous ai joint ? moi ça ne fonctionne pas...
      Cdt
      0
    2. Saucisson_47 Messages postés 11 Statut Membre
       
      Je suis arrivé à faire évoluer ma macro même si elle n'est pas optimale en fonction de vos conseils.
      J'ai remplacé Worksheet_change par worksheet_selectionchange.

      Maintenant, le changement est presque automatique... mais après avoir modifier la couleur dans la plage A38:A59, il faut que je sélectionne la cellule modifiée avec la souris ou les flèches pour que le changement s'applique à la plage A5:Ak:35... En ajoutant un simple range cela ne fonctionne pas...
      Je vous mets ci-dessous ma macro

      Private Sub Worksheet_Selectionchange(ByVal Target As Range)
      On Error Resume Next
      If Target.Count > 1 Then Exit Sub
      If Not Application.Intersect(Target, Range("A5:AK35,A38:A59")) Is Nothing Then

      If Target.Value = Range("A43") Then
      Target.Interior.Color = Range("A43").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A39") Then
      Target.Interior.Color = Range("A39").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A40") Then
      Target.Interior.Color = Range("A40").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A41") Then
      Target.Interior.Color = Range("A41").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A42") Then
      Target.Interior.Color = Range("A42").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next


      ElseIf Target.Value = Range("A44") Then
      Target.Interior.Color = Range("A44").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A45") Then
      Target.Interior.Color = Range("A45").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A46") Then
      Target.Interior.Color = Range("A46").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A47") Then
      Target.Interior.Color = Range("A47").Interior.Color

      ElseIf Target.Value = Range("A48") Then
      Target.Interior.Color = Range("A48").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A49") Then
      Target.Interior.Color = Range("A49").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A50") Then
      Target.Interior.Color = Range("A50").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A51") Then
      Target.Interior.Color = Range("A51").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A52") Then
      Target.Interior.Color = Range("A52").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A53") Then
      Target.Interior.Color = Range("A53").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A54") Then
      Target.Interior.Color = Range("A54").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A55") Then
      Target.Interior.Color = Range("A55").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf Target.Value = Range("A56") Then
      Target.Interior.Color = Range("A56").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next

      ElseIf IsNumeric(Target.Value) And Target.Value <> "" Then
      Target.Interior.Color = Range("A38").Interior.Color
      For Each cell In Range("A5:AK35")
      If cell.Value = Target.Value Then cell.Interior.Color = Target.Interior.Color
      Next
      Else
      Target.Interior.Color = xlNone
      End If

      End If

      End Sub
      0
  3. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  4. Frenchie83 Messages postés 2254 Statut Membre 339
     
    Bonjour,
    Oui , "Private Sub Worksheet_Selectionchange(ByVal Target As Range)" est plus approprié que "Private Sub Worksheet_Change(ByVal Target As Range)" mais de toute façon il faudra quitter puis revenir sur la cellule pour que le changement soit pris en compte.
    Dans la ligne "If Not Application.Intersect(Target, Range("A5:AK35, A38:A59")) Is Nothing Then ", pourquoi sélectionnez-vous la plage "A5:AK35" qui n'est que la zone ou doit s'appliquer le changement? La seule plage à contrôler est "A38:A59". Donc "If Not Application.Intersect(Target, Range("A38:A59")) Is Nothing Then ", suffit.
    Ensuite, pourquoi avoir ajouter toutes ces lignes qui contrôlent chaque cellule de la plage A58 à A59? Dans le code que j'avais fourni, je faisais appel à la macro "Appliquer" (seulement 3 lignes, tout en haut du le module 1) qui faisait exactement la même chose.
    Je vous retourne le fichier.
    https://www.cjoint.com/c/HCDcTkbXEqw

    Cdlt
    0
    1. Saucisson_47 Messages postés 11 Statut Membre
       
      Merci pour votre réponse. En fait, en ajoutant vos macros, les cases devenaient noires... donc du coup j'ai bricolé avec votre 2ème macro (celle à insérer dans un module)... mais aujourd'hui ça marche...
      Par contre, quand je modifie une case dans ma plage A5:AK35, il faut que j'aille passer sur la légende pour que la couleur s'applique. Il n'y a pas moyen pour que la macro se lance sans avoir à repasser sur les cellules?
      0
  5. Frenchie83 Messages postés 2254 Statut Membre 339
     
    RE
    Voici avec les modifs
    https://www.cjoint.com/c/HCDjsI4xSMw
    Cdlt
    0
    1. Saucisson_47 Messages postés 11 Statut Membre
       
      Bonjour,
      ça fonctionne mieux en effet !!
      Merci encore pour votre aide !
      0