Coloration d'une cellule en fonction des couleurs d'une ligne

Bobox29

XLDnaute Nouveau
Bonjour le forum.


Je viens une nouvelle fois vers vous pour que vous m'aidiez à trouver une solution pour l'ultime problème de mon fichier :)

J'ai utilisé du VBA pour automatiser la coloration des cellules de mon tableau en fonction de la date entrée dans chaque cellule, c'est du bidouillage mais ça marche très bien, donc soit ^^ .

Ce que je veux simplement désormais, c'est que pour chaque personne, la cellule où est écris leur nom se colore en :

• Rouge, si au moins une cellule de la plage est rouge (même si il y en a dix jaunes, du moment qu'il y a une rouge, ce doit être coloré en rouge)
• Jaune s'il y a au moins une cellule jaune dans la plage mais aucune cellule rouge
• Vert s'il n'y a ni cellule rouge ni cellule jaune dans la plage.

J'ai essayé avec "For Each" mais le problème, c'est que lorsqu'il parcours la plage, il s'arrête à la première cellule colorée (si la première est jaune, et la deuxième rouge, il colorera le nom en jaune et non pas en rouge).
J'avoue être un peu à cours d'idées... Si vous pouviez me diriger sur une piste plus intéressante, se serait génial !

D'avance merci !

PS : ci-joint mon fichier à l'état actuel (ne faites pas attention au code, c'est pas très optimal mais ça fonctionne ^^).
 

Pièces jointes

  • Copie de Exemple.xls
    142 KB · Affichages: 59
  • Copie de Exemple.xls
    142 KB · Affichages: 68
  • Copie de Exemple.xls
    142 KB · Affichages: 65

Gurgeh

XLDnaute Occasionnel
Re : Coloration d'une cellule en fonction des couleurs d'une ligne

Salut Bobox29,

Voici un prototype de code. Il faut que tu remplaces plage par quelque chose qui pointe vers la plage que tu veux traiter, et CelluleAColorier par quelque chose qui pointe vers la cellule à colorier.
Code:
ADuRouge = False
ADuJaune = False
For Each cellule In plage
    ADuRouge = ADuRouge Or (cellule.Interior.ColorIndex = 3)
    ADuJaune = ADuJaune Or (cellule.Interior.ColorIndex = 36)
Next
If ADuJaune Then CelluleAColorier.Interior.ColorIndex = 36
If ADuRouge Then CelluleAColorier.Interior.ColorIndex = 3

Gurgeh
 

Excel-lent

XLDnaute Barbatruc
Re : Coloration d'une cellule en fonction des couleurs d'une ligne

Bonjour Bobox29,

Si tu veux une macro simple à comprendre :

Dim NbCouleurRouge As Integer
Dim NbCouleurJaune As Integer


For i = PremièreLigne To DernièreLigne
NbCouleurRouge = 0
NbCouleurJaune = 0
----For j = PremièreColonne To DernièreColonne
--------If Cells(i, j).Interior.ColorIndex = CodeCouleurDeTonRouge Then NbCouleurRouge = NbCouleurRouge + 1
--------Else: If Cells(i, j).Interior.ColorIndex = CodeCouleurDeTonJaune Then NbCouleurJaune = NbCouleurJaune + 1
--------End If

'insérer ici le code pour colorier la cellule contenant le nom de la couleur que tu souhaite
'un code du genre :
'If NbCouleurRouge >= 1 Then Cells(..., ...).Interior.ColorIndex = CodeCouleurDeTonRouge
'Else If NbCouleurJaune >=1 Then Cells(..., ...).InteriorColorIndex = CodeCouleurDeTonJaune
'Else Cells(..., ...).InteriorColorIndex = CodeCouleurDeTonVert
'End If
----Next j
Next i

Remplacer les variables suivantes :
-> PremièreLigne => par le numéro de la première ligne à traiter
-> DernièreLigne => par le numéro de la dernière ligne de ton tableau
-> CodeCouleurDeTonRouge => par le code couleur de la couleur rouge qui te convient (le rouge par défaut a le nombre 255)
-> CodeCouleurDeTonJaune => par le code couleur de la couleur jaune qui te convient
-> CodeCouleurDeTonVert => par le code couleur de la couleur vert qui te convient


Ainsi la variable :
NbCouleurRouge => contiendra le nombre de cellule rouge sur la ligne en cours d'analyse
NbCouleurJaune => contiendra le nombre de cellule jaune sur la ligne en cours d'analyse

Bonne après midi
 
Dernière édition:

Bobox29

XLDnaute Nouveau
Re : Coloration d'une cellule en fonction des couleurs d'une ligne

Bonjour Gurgeh.

Donc si je comprends bien, tu initialises ADuRouge et ADuJaune, puis tu les soumet à un test pour savoir si ça devient True ou si ça reste False, c'est ça ?
Par contre, pour les deux conditions, ça va entrer en conflit non ? Car si il y a une cellule jaune et une cellule rouge dans la plage, il va colorer laquelle ? La condition positionnée en dernière ?
 

Bobox29

XLDnaute Nouveau
Re : Coloration d'une cellule en fonction des couleurs d'une ligne

Merci beaucoup Excel-Lent, ça marche parfaitement, et c'est très simple à comprendre en plus (c'est ce qui est le plus important pour moi, comprendre ce que je fais et pas recopier bêtement un code...).

Merci encore, et bonne après-midi :)
 

Bobox29

XLDnaute Nouveau
Re : Coloration d'une cellule en fonction des couleurs d'une ligne

En fait, ton code ne fonctionne pas Excel-Lent...

Je ne comprends pas trop pourquoi d'ailleurs, et même en modifiant un peu le code de la deuxième partie, rien n'y change, tout reste tel quel... Ca commence à chauffer là-haut ^^
 

Gurgeh

XLDnaute Occasionnel
Re : Coloration d'une cellule en fonction des couleurs d'une ligne

Bon, je reconnais que j'aurais pu faire quelque effort pour commenter un peu ce bout de code rustique...

En gros le principe est de partir de deux variables (ADuRouge et ADuJaune) qui ont une valeur fausse au départ, puis de regarder toutes les cellules de la plage, et d'utiliser la condition OR, ce qui permet de passer par exemple ADuRouge à vrai dès qu'une cellule est rouge, et de garder cette valeur vraie jusqu'à la fin de la plage, même si les autres cellules ne sont pas rouges.

Ensuite, je colorie d'abord la cellule de destination en jaune si ADuJaune est vrai, puis je la colorie en rouge si ADuRouge est vrai, et en le faisant dans cet ordre là je respecte la priorité que tu as donnée (rouge est plus prioritaire que jaune).

A ta disposition pour plus d'info

Gurgeh
 

Gurgeh

XLDnaute Occasionnel
Re : Coloration d'une cellule en fonction des couleurs d'une ligne

Salut Excel-lent,

Je me suis permis de regarder le code fourni (fort bien commenté par ailleurs, j'en prendrai modèle).

Peut être y a-t-il un problème au niveau des 2 next, qui devraient être placés avant le bloc qui sert à colorer la cellule finale ?

Gurgeh
 

Excel-lent

XLDnaute Barbatruc
Re : Coloration d'une cellule en fonction des couleurs d'une ligne

Bonsoir Bobox29, Gurgeh,

J'ai fais la macro les yeux fermé : impossibilité de la tester. D'où 2-3 p'tits bugs.

En voulant la fiabilisé, j'ai remarqué :
-> le nom est sur deux lignes! Et non pas une. J'ai contourné le problème ainsi :

VB:
Sub ColoriageNom()

Dim NbCouleurRouge As Integer
Dim NbCouleurJaune As Integer
Dim NuméroLigne As Integer
Dim NuméroColonne As Integer
Dim NuméroLigneNom As Integer


'Je pars du principe que tu utilise :
' -> le jaune ayant pour code : 6 -> jaune "normal"
' -> le rouge ayant pour code : 3 -> rouge "normal"
' -> le vert ayant pour code : 10 -> vert "normal"


'Attention, sur ton fichier (avant que je le modifie) il y avait du jaune "normal" et du jaune clair.
'Je suis persuadé que le bug de ta macro provenait en partie de ce problème.

For NuméroLigne = 5 To 32

    If Int(NuméroLigne / 2) - NuméroLigne / 2 <> 0 Then
        NbCouleurRouge = 0
        NbCouleurJaune = 0
    End If
    
    For NuméroColonne = 7 To 22
        If Cells(NuméroLigne, NuméroColonne).Interior.ColorIndex = 6 Then
              NbCouleurRouge = NbCouleurRouge + 1
        Else: If Cells(NuméroLigne, NuméroColonne).Interior.ColorIndex = 3 Then NbCouleurJaune = NbCouleurJaune + 1
        End If
     Next NuméroColonne

    If Int(NuméroLigne / 2) - NuméroLigne / 2 = 0 Then
        If NbCouleurRouge >= 1 Then
              Range(Cells(NuméroLigne, 2), Cells(NuméroLigne + 1, 2)).Interior.ColorIndex = 3
        Else: Select Case NbCouleurJaune
                    Case 1 To 15
                        Range(Cells(NuméroLigne, 2), Cells(NuméroLigne + 1, 2)).InteriorColorIndex = 6
                    Case 0
                        Range(Cells(NuméroLigne, 2), Cells(NuméroLigne + 1, 2)).InteriorColorIndex = 10
              End Select
        End If
    End If
Next NuméroLigne
        
End Sub

Mais tu as 2/3 autres problèmes qui font que la macro fonctionne pas ou mal :
-> tu as dans ton tableau du "jaune normal" et du "jaune clair". Or la macro ci-dessus ne compte que le "jaune normal".
-> dans tes colonnes G à V (colonnes traitées par la macro ci-dessus : "For NuméroColonne = 7 To 22") il y a des cellules fusionnées!!!!

Tout ça met la pagaille dans l'exécution de la macro et/ou fausse le résultat.

Si tu maintient les cellules fusionnées (dans la zone colonne G à V), je ne vois pas de solution simple.

Les noms sont fusionnés sur deux lignes, mais cela ne pose aucun problème à la macro, grâce aux deux ajouts que j'ai fais.

Tiens nous au courant

Bonne fin de semaine
 

Discussions similaires