Dénombrer les cellules colorées par MFC
Bonjour,
J'ai un problème de taille et ne parviens pas à le résoudre toute seule, je fais donc appel à vos lumières.
J'ai un tableau d'environ 80 colonnes. Sur ces 80 colonnes, certaines cellules sont colorées en rouge par une ou plusieurs mises en forme conditionnelles (avec des formules complexes). Sur l'ensemble de mes colonnes j'ai 29 MFC possible...
Je voudrais en fin de ligne dénombrer combien il y a de cellules rouges. Je sais que je ne peux faire autrement que passer par VBA pour le faire, en théorie ça me fait pas peur mais là je sèche... J'ai bien trouvé quelque chose mais je n'arrive pas à l'adapter à mon cas car je ne comprends pas le déroulé.
Si quelqu'un pouvait m'aiguiller un peu je lui en serais grandement reconnaissante!
En pièce jointe mon fichier, j'ai enlevé quelques MFC pour alléger le fichier
Et là où j'ai trouvé les infos:
http://boisgontierjacques.free.fr/pages_site/mfc.htm#comptemfc
D'avance merci!
Bonjour
Sujet traité il a peu de temps
Prend ce code et place le dans un module
Function NbreCellulesCouleur(Plage As Range, Couleur As Byte) As Long
'Compter le nombre de cellules d'une couleur donnée dans une plage donnée
'Plage: plage de cellules à inspecter
'Couleur: valeur de la couleur cherchée
Application.Volatile
Dim Cellule As Range
For Each Cellule In Plage
If Cellule.Interior.ColorIndex = Couleur And Not IsEmpty(Cellule) Then
NbreCellulesCouleur = NbreCellulesCouleur + 1
End If
Next Cellule
End Function
ensuite depuis ta feuille appliquez la formule (exemple)
=NbreCellulesCouleur(B5:B21;3)
où 3 est la couleur rouge
Bonjour,
Une couleur issue de MFC n'est pas la couleur du fond de la cellule, on ne peut donc l'identifier. C'est une question récurente.
Si une MFC est appliquée, l'application du format couleur résulte nécessairement d'une condition, c'est à partir de cette condition que l'on peut opérer...
Cordialement.
Merci pour ta réponse rapide, a priori d'après mes tests cette formule va dénombrer les cellules colorées en rouge manuellement et non celles colorées par une mise en forme conditionnelle.
M12 a écrit :Bonjour
Sujet traité il a peu de temps
Prend ce code et place le dans un module
Function NbreCellulesCouleur(Plage As Range, Couleur As Byte) As Long 'Compter le nombre de cellules d'une couleur donnée dans une plage donnée 'Plage: plage de cellules à inspecter 'Couleur: valeur de la couleur cherchée Application.Volatile Dim Cellule As Range For Each Cellule In Plage If Cellule.Interior.ColorIndex = Couleur And Not IsEmpty(Cellule) Then NbreCellulesCouleur = NbreCellulesCouleur + 1 End If Next Cellule End Function
ensuite depuis ta feuille appliquez la formule (exemple)
=NbreCellulesCouleur(B5:B21;3)
où 3 est la couleur rouge
Bonjour MFerrand,
Il me semble bien que la couleur MFc n'est pas la même que le remplissage classique. Et j'avais espéré que quelqu'un trouverait une parade afin de m'éviter d'écrire des lignes et des lignes de code pour tester toutes les conditions...Bon j'ai plus qu'à m'y mettre quand même!
Je reviendrais sans doute demander de l'aide, ça m'étonnerai que j'y arrive du premier coup...
En tout cas merci de votre aide!
MFerrand a écrit :Bonjour,
Une couleur issue de MFC n'est pas la couleur du fond de la cellule, on ne peut donc l'identifier. C'est une question récurente.
Si une MFC est appliquée, l'application du format couleur résulte nécessairement d'une condition, c'est à partir de cette condition que l'on peut opérer...
Cordialement.
Re,
Ok j'avais pas pensé à la MFC
Donc place ce code dans le module à la place de l'autre
Function CouleurMFC(cel)
Application.Volatile
Set c = Range(cel.Address)
ff = Array("Somme", "aujourdhui()", "nb.si", "equiv", "recherchev", _
"Nbval", "sommeprod", "joursem", "gauche", "droite", "stxt")
fa = Array("Sum", "today()", "countif", "match", "vlookup", _
"counta", "sumproduct", "weekday", "left", "right", "mid")
a = Array("=", ">", "<", ">=", "<=", "<>", "BETWEEN")
b = Array(xlEqual, xlGreater, xlLess, xlGreaterEqual, xlLessEqual, xlNotEqual, xlBetween)
i = 1
Do While i <= c.FormatConditions.Count And Not témoin
If c.FormatConditions(i).Type = xlCellValue Then
tmp1 = Evaluate(c.FormatConditions(i).Formula1)
oper = a(Application.Match(c.FormatConditions(i).Operator, b, 0) - 1)
If oper <> "BETWEEN" Then
If Evaluate(c & oper & tmp1) Then
coul = c.FormatConditions(i).Interior.ColorIndex
témoin = True
End If
Else
tmp2 = Evaluate(c.FormatConditions(i).Formula2)
If Evaluate("AND(" & c & ">=" & tmp1 & "," & c & "<=" & tmp2 & ")") Then
coul = c.FormatConditions(i).Interior.ColorIndex
témoin = True
End If
End If
Else
Z = c.FormatConditions(i).Formula1
For k = LBound(ff) To UBound(ff)
Z = Replace(Z, UCase(ff(k)), UCase(fa(k)))
Next k
If Evaluate(Z) = True Then
coul = c.FormatConditions(i).Interior.ColorIndex
témoin = True
End If
End If
i = i + 1
Loop
CouleurMFC = coul
End Function
Function SommeCoulMFC(champ As Range, coul)
Application.Volatile
t = 0
For Each c In champ
If CouleurMFC(c) = coul Then
t = t + c.Value
End If
Next c
SommeCoulMFC = t
End Function
et pour la formule
=SommeCoulMFC(B1:B5;3)
Pas mieux, ça m'affiche #VALEUR! dans la cellule de destination.
Et du coup je ne comprends plus à sert le 3 dans la formule puisque si j'ai bien compris le rouge issu de la MFC n'est pas le même rouge que celui par remplissage classique.
Re,
en exemple, chez moi cela fonctionne
le 3 pour le rouge
le 4 pour le vert
le 5 pour le bleu
le 1 pour le noir
Après si ta MFC tu as choisi une couleur des couleurs originales ???
le rouge en RVB c'est 255,0,0
le vert 0,255,0
le bleu 0,0,255
le noir 0,0,0
sinon si c'est des couleurs personnalisées, le VBA sera surement nécessaire
Bonjour SF-TU, M12,
J'ai déjà aperçu au passage cette fonction, ou une parente. Je n'ai pas pris le temps jusqu'à présent de m'y pencher, aussi je n'en dirai rien, et de toutes façons il n'y a que les tests faits dans de bonnes conditions qui peuvent être probants.
Je pense qu'il doit être effectivement possible de bâtir une fonction personnalisée qui réponde à au moins quelques cas de MFC mais la question est d'une grande complexité, surtout Excel 2007 qui a largement accru les possibilités de MFC.
Il est cependant un point sur lequel je demeure réservé, c'est toutes les fonctions relatives aux couleurs utilisant ColorIndex. Elles ont été généralement bâties avant l'apparition des nouvelles versions d'Excel, et jusqu'à Excel 2003 c'était logique, on ne connaissait que la palette de couleurs identifiées par l'index de couleur. On pouvait personnaliser des couleurs en utilisant la fonction RGB mais elles étaient immanquablement ramenées à la couleur la plus proche de la palette. Pour les rendre durables, il fallait personnaliser la palette en substituant des couleurs. Et donc jusque là, même si la palette était personnalisée, dans un même classeur, on pouvait se référer fiablement à un index de couleur, toute couleur du classeur étant alors identifiée par un index se référant à la palette dudit classeur.
Or, depuis Excel 2007 les choses ont changées en la matière, la palette existe toujours pour raison de compatibilité, mais ce n'est plus elle qui est au premier plan et le nombre de couleurs utilisables est devenu sans commune mesure avec l'ancienne situation.
ColorIndex renvoie toujours une valeur, mais peut-on désormais être assuré qu'elle est dans tous les cas fiable ?
Lorsqu'on travaille sur un classeur .xls sur un Excel 2007 ou ulltérieur, et qu'on l'enregistre au format 97-2003, si l'on a quelque peu coloré ici ou là il est pratiquement inévitable d'avoir le message du vérificateur de compatibilité qui signale une perte mineure de fidélité...
Je crois qu'il est à la fois judicieux et prudent de réviser toutes les fonctions de ce type pour basculer les références à ColorIndex sur la propriété Color, dont on peut être assuré qu'elle répond aux exigences actuelles.
Cordialement.
Effectivement M12, avec ton fichier ça marche, la seule différence entre ton fichier et le mien c'est que la condition de mise en forme est simple dans ton cas avec "si la valeur est égale à". Pour moi j'ai de longues formules avec des si imbriqués, des calculs de nombre de caractères, des "si la cellule contient"... J'imagine que c'est ça qui coince mais je vais faire quelques tests pour vérifier car j'ai bien utilisé les couleurs "normales" de la palette, j'ai fait simple pour ça!
Et MFerrand, je vais aussi essayer en remplaçant ColorIndex par Color au cas où...
Je n'ai jamais fait de véritable test en la matière, mais à part le jaune et le rouge, la plupart des autres couleurs de base immédiatement accessible par les thèmes de couleurs n'y sont pas. Cependant, si la distinction est bien assurée ColorIndex renverra le même index même si ce n'est pas exactement celui qui lui correspond dans la palette.
Là où cela me paraît plus problématique c'est quand tu commences à avoir pas mal de couleurs et où certaines distinctions se font dans les nuances... Il faudrait tester, mais c'est toujours long de tester de façon valide...
Bon courage.