Macro avec cellule de mise en forme conditionnelle

Résolu/Fermé
Saucisson_47 Messages postés 11 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 13 avril 2018 - 23 mars 2018 à 14:39
Saucisson_47 Messages postés 11 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 13 avril 2018 - 3 avril 2018 à 09:04
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

Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
24 mars 2018 à 07:18
Bonjour
Comme ceci, si j'ai bien compris
https://www.cjoint.com/c/HCygsj3i7ww
Cdlt
0
Saucisson_47 Messages postés 11 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 13 avril 2018
27 mars 2018 à 09:54
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
Saucisson_47 Messages postés 11 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 13 avril 2018
27 mars 2018 à 12:05
Je vous mets mon fichier en ligne
https://www.cjoint.com/c/HCBkd2WKqBx
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
28 mars 2018 à 03:48
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
Saucisson_47 Messages postés 11 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 13 avril 2018
28 mars 2018 à 09:25
Bonjour et merci,
Cela fonctionne chez vous sur le fichier que je vous ai joint ? moi ça ne fonctionne pas...
Cdt
0
Saucisson_47 Messages postés 11 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 13 avril 2018
28 mars 2018 à 11:47
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
29 mars 2018 à 04:47
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
Saucisson_47 Messages postés 11 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 13 avril 2018
29 mars 2018 à 09:58
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
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
29 mars 2018 à 11:19
RE
Voici avec les modifs
https://www.cjoint.com/c/HCDjsI4xSMw
Cdlt
0
Saucisson_47 Messages postés 11 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 13 avril 2018
3 avril 2018 à 09:04
Bonjour,
ça fonctionne mieux en effet !!
Merci encore pour votre aide !
0