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!

52fichier-controle.zip (220.92 Ko)

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.

Rechercher des sujets similaires à "denombrer colorees mfc"