Mise en forme conditionnelle
ou
Comment changer de couleur une cellule en fonction de sa valeur

 

Exemple 5

EXCEL 2000, 2002

Vous possèdez une liste de nombre et de nom. Vous aimeriez que cinq valeurs clefs apparaissent en 5 couleurs différentes.

Impossible de le faire avec la mise en forme conditionnelle traditionnelle, car elle est limitée à 3 mises en forme différentes. Nous allons donc programmer en VBA une macro. N'oubliez pas de consulter les Astuces Macro pour pouvoir lancer la macro depuis le menu contextuel, un raccourci clavier,....

A
B
1
0  
2
10  
3
20  
4
30  
5
40  
6
Pierre  

Que va faire le programme si dessous :

Une fois que votre tableau possède toutes ses valeurs, vous lancez le programme. Il va sélectionner les cellules A1 à AZ250, puis il va chercher dans chacune des cellules sélectionnées les valeurs clefs et chaque fois qu'il trouvera une valeur clef il changera la couleur du fond de la cellule.

Lorsque vous supprimez une valeur clef, le fond de la cellule reste coloré. Pour que le fond retrouve sa couleur par défaut, vous relancez le programme.

Les valeurs clefs sont intégrées dans le programme, si vous préférez qu'elles soient accessibles depuis la feuille reportez vous à la remarque 2.

La programmation :

Programmer en VBA n'est pas très compliquer, réaliser se qui est indiqué ci dessous et tout se passera bien.

Sélectionner le menu Outils\Macro\Nouvelle Macro...

Une boite de dialogue Enregistrer une macro apparait.

Cliquer sur le bouton OK.

Une boite de dialogue Arrête apparait.

Cliquer sur le bouton bleu Arrêter l'enregistrement.

Sélectionner le menu Outils\Macro\Macros...

Une boite de dialogue Macro apparait.

Cliquer sur le bouton Modifier.

Une fenetre Microsoft Visual Basic apparait.

Supprimer les instructions se trouvant dans la grande fenetre de droite et remplacer les par celles se trouvant ci-dessous (copier/coller) (référez vous à l'image du résultat final ci après) :

Sub definirremplissage()
'
' definirremplissage Macro
' Macro enregistrée le 04/05/2003 par a
Range("a1:az250").Select
Range("a1").Activate
Dim lacellule As Range
For Each lacellule In Selection
couleurderemplissage = lacellule
Next lacellule
Range("a1:a1").Select
Range("a1").Activate
'
End Sub

Property Let couleurderemplissage(lacellule As Range)
Dim indexcouleur As Integer
Select Case lacellule.Value

Case "10"
indexcouleur = 7
Case "20"
indexcouleur = 8
Case "30"
indexcouleur = 6
Case "40"
indexcouleur = 5
Case "Pierre"
indexcouleur = 4
Case Else
indexcouleur = xlColorIndexNone

End Select
lacellule.Interior.ColorIndex = indexcouleur
End Property

Vous obtenez ceci :

Enregistrer votre document.

La programmation est finie. Fermer Microsoft Visual Basic.

Pour lancer le programme :

Sélectionner le menu Outils\Macro\Macros...

Une boite de dialogue Macro apparait.

Cliquer sur le bouton Exécuter.

Remarque 1:

Pour que le programme fonctionne plus vite réduiser la taille de la sélection (Range("a1:az250").Select) au dimension de votre tableau d'analyse ou reporter vous à la remarque 5.

Vous pouvez combiner les différentes instructions (du programme ci dessus et des remarques ci dessous), pour obtenir le résultat que vous souhaitez.

Faites attention à l'ordre dans lequel vous placez les instructions : le programme réalise la première instruction puis la deuxième, ...

Remarque 2 :

Si vos valeurs clefs changent d'une feuille à une autre, définiser la liste de vos valeurs clefs dans une région non utilisé de votre tableau (par exemple de BB1 à BB5) et utiliser les instructions suivantes.

Sub definirremplissage()
'
' definirremplissage Macro
' Macro enregistrée le 04/05/2003 par a
Range("a1:az250").Select
Range("a1").Activate
Dim lacellule As Range
For Each lacellule In Selection
couleurderemplissage = lacellule
Next lacellule
Range("a1:a1").Select
Range("a1").Activate
'
End Sub

Property Let couleurderemplissage(lacellule As Range)
Dim indexcouleur As Integer

If lacellule.value=range("bb1:bb1").value then
indexcouleur = 7
End If
If lacellule.value=range("bb2:bb2").value then
indexcouleur = 8
End If
If lacellule.value=range("bb3:bb3").value then
indexcouleur = 6
End If
If lacellule.value=range("bb4:bb4").value then
indexcouleur = 5
End If
If lacellule.value=range("bb5:bb5").value then
indexcouleur = 4
End If


lacellule.Interior.ColorIndex = indexcouleur
End Property

Remarque 3 :

Si plusieurs valeurs clefs ont la même couleur de fond, alors vous pouvez utiliser l'instructions suivantes :

If lacellule.value="PIERRE" or lacellule.value="Pierre" or lacellule.value="Paul" then
indexcouleur = 4
End If

Si une plage de valeur a une même couleur de fond (par exemple toutes les valeurs de 652 à 785), alors vous pouvez utiliser l'instructions suivantes :

Select Case lacellule.Value

Case 652 to 785
indexcouleur = 7
Case Else
indexcouleur = xlColorIndexNone

End Select

Remarque 4 :

Si vous désirez que toutes les cellules remplies soient colorés d'une même couleur, alors vous pouvez utiliser l'instructions suivantes :

If lacellule.value<>"" then
indexcouleur = 4
End If

Cette instruction est particulièrement intéressante à utiliser en premier, car après avoir colorer toutes les cellules remplies, les instructions des valeurs clefs coloreront d'une couleur différente les cellules intéressantes. Attention pour que cette astuce fonctionne vous devez supprimer les instructions (si vous les utilisez) :
Case Else
indexcouleur = xlColorIndexNone

Remarque 5 :

Un code différent (qui ne reconnait que les chiffres) mais qui est beaucoup plus rapide :

Sub FormatConditionnel()
Dim wCell As Range, v As Variant, Nbre As Boolean

For Each wCell In ActiveSheet.UsedRange
v = wCell.Value
If IsNumeric(wCell.Value) Then
wCell.Interior.ColorIndex = _
Switch( _
v = 10, 7, _
v = 20, 8, _
v = 30, 6, _
v = 40, 5, _
v >150, 4, _
v = 100, 9)
Else
wCell.Interior.ColorIndex = 0
End If
Next wCell
End Sub