[VBA] Etablir une condition en fonction du formatage d’une MFC

Il est fréquent de vouloir conditionner une action aux résultats d’une Mise en Forme Conditionnelle (MFC).
Or une MFC ne formate pas directement une cellule.
Pour vous en convaincre :

sélectionnez la cellule A1
saisissez le chiffre 5

puis, toujours en gardant le curseur sur la cellule A1

(pour Excel 2007) Accueil
Mise en forme conditionnelle
Règles de mise en surbrillance des cellules
Egal à

Une boite de dialogue apparait avec le chiffre 5 dans l’espace de gauche et « Remplissage rouge clair avec texte rouge foncé » dans l’espace de droite. Cliquez sur OK.

Notre cellule A1 devient rouge.
Appliquons à cette page la macro suivante :

Sub couleur()
Dim maCouleur As Long
maCouleur = Range("A1").Interior.Color
Range("B1").Interior.Color = maCouleur
End Sub

Nous enregistrons dans la variable maCouleur le N° de la couleur de fond de la cellule A1 maCouleur = Range("A1").Interior.Color puis allons demander à la macro d’appliquer la même couleur de fond à la cellule B1 Range("B1").Interior.Color = maCouleur. La cellule B1 reste blanche et si vous avez conservé le quadrillage de la feuille, celui-ci a disparu : ceci est caractéristique du coloriage des cellules.

Explications

Nous en déduisons qu’une MFC n’applique ses formats directement sur la cellule mais plutôt sur un « calque » (un peu à la façon de photoshop).

Dans l’exemple suivant, nous avons formaté la colonne A avec une MFC.

Nous récupérons les conditions de la MFC en sélectionnant la colonne A puis

Accueil
Mise en forme conditionnelle
Gérer les règles

MFC1

La boîte de dialogue nous apprend que pour la plage de cellules A1 à A20, le fond de toutes les cellules dont la valeur est inférieure à 5 est colorié en rouge.

MFC2

Nous allons créer une macro qui affichera un « x » à la droite de chaque cellule rouge de notre plage :

Sub MCF()
Dim Cel As Range
MsgBox "A partir de la couleur visible."
For Each Cel In Range("A1:A20")
    If Cel.Interior.Color = vbRed Then a.Offset(, 1) = "x"
Next Cel
End Sub

Pour chaque cellule de la plage A1-A20 For Each Cel In Range("A1:A20"), si la couleur de fond de la cellule est rouge If Cel.Interior.Color = vbRed, alors la cellule immédiatement à droite affiche « x »  Then a.Offset(, 1) = "x".
Comme nous pouvions nous y attendre, il ne se passe rien puisque la macro ne trouve pas de couleur dans la cellule.
Nous allons donc ajouter le code suivant à la suite du précédent :

MsgBox "A partir de la condition de la MFC."
For Each Cel In Range("A1:A20")
    If Cel < 5 Then Cel.Offset(, 1) = "x"
Next Cel

Il ne s’agit donc plus de vérifier la couleur de notre cellule mais de reprendre la condition de la MFC, c’est à dire vérifier si la valeur de la cellule est inférieure à 5 If Cel < 5 Then; et là, notre code fonctionne.

Ci-dessous le fichier au format .xls contenant les exemples de cet article.
Exp MFC