Compter le nombre de cellules d'un champ ayant une couleur MFC

toinou1

XLDnaute Nouveau
Bonjour les amis.

Malgré de nombreux messages sur le sujet sur le forum, je ne parviens pas (a comprendre et?) a mettre en pratique le comptage de cellules ayant une couleur MFC...

J'ai l'impression que les script de macro sont trop anciens (j'utilise XL2010 et ce qui est suggéré a cette page ne fonctionne pas La mise en forme conditionnelle) et que les solutions alternatives ne sont pas applicables dans mon cas (https://www.excel-downloads.com/thr...avec-une-mise-en-forme-conditionnelle.166154/)...

Voici mon fichier, j'ai besoin de compter combien de cellules sont en jaune dans chaque ligne... Est-ce faisable ??

Merci !
 

Pièces jointes

  • 20130819shift planning.xlsm
    435 KB · Affichages: 168
  • 20130819shift planning.xlsm
    435 KB · Affichages: 194
  • 20130819shift planning.xlsm
    435 KB · Affichages: 200

JBARBE

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Bonsoir à tous,
La MFC empêche de compter les cellules jaunes !!

De ce fait, il serait intéressant de pouvoir mettre ce jaune à l'aide d'une macro !!

Pour ma part et compte tenu de la complexité du contenu des cellules devant être jaune, je ne trouve pas de solution pour cette macro !

Sans la possibilité de supprimer la MFC des cellules jaunes et de pouvoir la remplacer par une macro qui tiendrait compte du contenu des cellules concernées il n'y a pas de solution !

sinon le comptage serait possible !

Bonne soirée !
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Bonjour,
Reprenons à la base : soit une MEFC qui dit : si valeur de la cellule >3 mettre en jaune.
On ne compte pas le nombre de cellules jaunes car une MEFC a mis cette couleur jaune, on compte le nombre de cellules dont la valeur est supérieure à 3. Le jaune mis par une MEF a l'air d'être le même que celui qu'on met manuellement mais excel lui attribue un code numérique qui n'a rien à voir et qu'on ne peut pas récupérer.

Ici il faut donc compter les cellules qui répondent vrai à
=RECHERCHEV($AF3;INDIRECT(AG$2);3;FAUX)="O"

Ou alors il faut mettre la couleur jaune en VBA (et tant qu'à faire compter en même temps le nombre de cellules répondant au critère).
 

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Bonjour à tous, bonjour Toinou1, JBARBE et Misange

Comme disent JBARBE et Misange, soit il faut faire avec la définition de la MFC, soit avec une macro, et pas avec la couleur jaune obtenue avec la MFC.

Pour ce qui est de la définition de la MFC...
En AG3, dans RECHERCHEV($AF3;INDIRECT(AG$2);3;FAUX)="O", le terme INDIRECT(AG$2) désigne une plage de la feuille O_1.
En AH3, cette définition deviendra automatiquement (mais on ne le voit pas écrit à l'écran) RECHERCHEV($AF3;INDIRECT(AH$2);3;FAUX)="O" (Car il ni a pas de $ devant le AG$2), dans laquelle INDIRECT(AH$2) désigne une plage de la feuille O_2. Et ainsi de suite...

Comme il faut faire des recherches (avec RECHERCHEV) et des tests (avec ="O") dans plusieurs feuilles, puis sommer l'ensemble des résultats, peut être qu'on peut faire avec une SOMME 3D. Peut être...

Dès que j'ai le temps, si ce n'est déja fait par un autre forumeur, j'essayerai de m'y mettre après avoir fait un petit tour sur le site de J. Boisgontier...

@ plus
 
Dernière édition:

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Bonsoir à tous

Une possibilité en colonne AS, à vérifier, trouvée en partant d'une proposition faite par J. Boisgontier (Formules Matricielles 3D) (Somme 3D avec 3 conditions).

@ plus

PS : La formule dans la colonne AS ne compte pas les cellules jaunes sur la ligne en cours en feuille Overview, mais le total des lignes des feuilles O_C1 à O_C12 ayant la bonne date en colonne AC et un "O" en colonne AE. Si il ni a pas de doublon en colonne AC dans les feuilles O_C1 à O_C12, cela donne le même nombre vu la formule utilisée dans la MFC coloriant les cellules en jaune.
 

Pièces jointes

  • 20130819shift planning.xlsm
    424 KB · Affichages: 104
  • 20130819shift planning.xlsm
    424 KB · Affichages: 128
  • 20130819shift planning.xlsm
    424 KB · Affichages: 122
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Bonsoir à tous.


Bonjour,
Reprenons à la base : soit une MEFC qui dit : si valeur de la cellule >3 mettre en jaune.
On ne compte pas le nombre de cellules jaunes car une MEFC a mis cette couleur jaune, on compte le nombre de cellules dont la valeur est supérieure à 3. Le jaune mis par une MEF a l'air d'être le même que celui qu'on met manuellement mais excel lui attribue un code numérique qui n'a rien à voir et qu'on ne peut pas récupérer.

Ici il faut donc compter les cellules qui répondent vrai à
=RECHERCHEV($AF3;INDIRECT(AG$2);3;FAUX)="O"

Ou alors il faut mettre la couleur jaune en VBA (et tant qu'à faire compter en même temps le nombre de cellules répondant au critère).
(...)

Comme disent JBARBE et Misange, soit il faut faire avec la définition de la MFC, soit avec une macro, et pas avec la couleur jaune obtenue avec la MFC.

(...)
Vite dit ! Je suis plus optimiste car il me semble qu'on peut "récupérer" le code des couleurs associées aux mises en forme conditionnelle. On peut donc compter les cellules selon leur couleur : inutile de savoir si la couleur est là parce que la valeur des cellules est supérieure à trois ou bien qu'elle résulte d'une formule plus ou moins compliquée.

Exemple dans le classeur joint. On verra que, dans le code, on ne fait à aucun moment référence aux conditions qui engendrent la mise en forme :​
VB:
Sub toto(plage As Range, cellule As Range)
Dim i, cel, w, c()
    Set w = plage.Cells(1, 1).FormatConditions
    ReDim c(1 To w.Count, 2)
    For i = 1 To w.Count
        c(i, 0) = w(i).Interior.Color
        c(i, 1) = 0
        c(i, 2) = w(i).Font.Color
    Next
    With plage
        For Each cel In .Cells
            For i = 1 To w.Count
                If cel.DisplayFormat.Interior.Color = c(i, 0) Then c(i, 1) = c(i, 1) + 1
            Next
        Next
    End With
    With cellule
        .Resize(1, 2) = Array("couleur", "nombre")
        For i = 1 To w.Count
            .Offset(i).Interior.Color = c(i, 0)
            .Offset(i).Font.Color = c(i, 2)
        Next
        .Offset(1).Resize(w.Count, 2).Value = c
    End With
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Cible As Range, Contremander As Boolean)

    If Not Intersect(Cible, Range("B3:E6")) Is Nothing Then toto Range("B3:E6").Cells, Range("C9").Cells: Contremander = True
End Sub
Ce n'est qu'un exemple sommaire, mais on doit pouvoir en tirer quelque chose dans d'autres situations. À moins que je me goure...


Bonne nuit.


ROGER2327
#6773


Jeudi 12 Phalle 140 (Sainte Andouille, amphibologue - fête Suprême Quarte)
5 Fructidor An CCXXI, 9,3082h - saumon
2013-W34-4T22:20:23Z
 

Pièces jointes

  • Compter le nombre de cellules d'un champ ayant une couleur MFC.xlsm
    44.9 KB · Affichages: 289
  • Compter le nombre de cellules d'un champ ayant une couleur MFC.xlsm
    44.9 KB · Affichages: 280
  • Compter le nombre de cellules d'un champ ayant une couleur MFC.xlsm
    44.9 KB · Affichages: 220
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Clap Clap Clap :)
Voilà qui mets à mal des années de fausses certitudes de ma part (et d'essais ratés aussi).
Cette page de Chip Pearson
Conditional Formatting Colors
est régulièrement citée en réponse à la question comment compter les cellules coloriées par MEFC
mais elle a des limitations MAJEURES je trouve, notamment le fait qu'on ne peut pas l'utiliser quand une MEFC est appliquée avec une formule (je pense que j'utilise les conditions "la valeur est" dans moins de 5% des cas où j'utilise une mefc).
Ta solution est splendide ! J'archive très précieusement. Si tu m'y autorises, je la mettrai volontiers en ligne sur excelabo pour en faire profiter plus de monde (avec le lien vers XLD).
 

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Re...


Bonjour à tous

Si on peut compter les cellules coloriées avec une MFC, et bien tant mieux... Ca servira certainement à beaucoup.

@ plus
C'est possible...

Vous noterez toutefois que je propose ce code dans la section EXCEL 2010[SUP]©®[/SUP]™ et non dans la section générale. En effet, il me semble que la solution ne fonctionne pas dans les versions antérieures à EXCEL 2010[SUP]©®[/SUP]™.​



ROGER2327
#6774


Vendredi 13 Phalle 140 (Sainte Bitre, ouvreuse et Etalon, couvreur - fête Suprême Quarte)
6 Fructidor An CCXXI, 2,2018h - tubéreuse
2013-W34-5T05:17:04Z
 

Modeste geedee

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Bonsour®
Re...


C'est possible...

Vous noterez toutefois que je propose ce code dans la section EXCEL 2010[SUP]©®[/SUP]™ et non dans la section générale. En effet, il me semble que la solution ne fonctionne pas dans les versions antérieures à EXCEL 2010[SUP]©®[/SUP]™.​

;)
:mad:
pour abonder à l'intervention de Flo ... :rolleyes:
Clap Clap Clap
Voilà qui mets à mal des années de fausses certitudes de ma part (et d'essais ratés aussi).
ça y est, me voilà encore une fois rabaissé au status de dinosaure ...


Grrrrr...... cel.DisplayFormat.Interior.Color !!!!
 

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Re...


Bonjour,

petit bémol si je peux me permettre... ça compte les cellules ayant une couleur, que celle ci vienne d'une mfc ou pas (ou alors j'ai pas bien pigé le truc)
Essayez ! Vous saurez ce qu'il en est.​



ROGER2327
#6775


Vendredi 13 Phalle 140 (Sainte Bitre, ouvreuse et Etalon, couvreur - fête Suprême Quarte)
6 Fructidor An CCXXI, 3,5440h - tubéreuse
2013-W34-5T08:30:20Z
 

portequoi

XLDnaute Nouveau
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Ben c'est ce que j'ai fais... et ça compte aussi les cellules qui ont une couleur sans MFC
Dans le tableau joint, j'ai mis une MFC sur les cellules B3 à D6, je fais un double clic sur C5 et ça me donne 6 alors que les cellules E3 à E6 n'ont pas de MFC

je me trompe ?
 

Pièces jointes

  • Compter le nombre de cellules d'un champ ayant une couleur MFC.xlsm
    45.6 KB · Affichages: 128
  • Compter le nombre de cellules d'un champ ayant une couleur MFC.xlsm
    45.6 KB · Affichages: 139
  • Compter le nombre de cellules d'un champ ayant une couleur MFC.xlsm
    45.6 KB · Affichages: 157

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre de cellules d'un champ ayant une couleur MFC

Re...


Ben c'est ce que j'ai fais... et ça compte aussi les cellules qui ont une couleur sans MFC
Dans le tableau joint, j'ai mis une MFC sur les cellules B3 à D6, je fais un double clic sur C5 et ça me donne 6 alors que les cellules E3 à E6 n'ont pas de MFC

je me trompe ?
Non, vous ne vous trompez pas complètement, mais la situation est plus compliquée qu'il y paraît.
J'ai dit, en proposant mon code pour dissiper une croyance antique :​
Ce n'est qu'un exemple sommaire, mais on doit pouvoir en tirer quelque chose dans d'autres situations.

L'exemple que j'ai traité s'applique à une plage comportant uniquement une mise en forme conditionnelle (MFC) uniforme à l'exclusion de mise en forme fixe (MFF). C'est pourquoi le code commence par​
VB:
    Set w = plage.Cells(1, 1).FormatConditions
La boucle​
VB:
    For i = 1 To w.Count
        c(i, 0) = w(i).Interior.Color
        c(i, 1) = 0
        c(i, 2) = w(i).Font.Color
    Next
relève donc les couleurs applicables à la première cellule de la plage étudiée par la MFC.

Ensuite, la boucle​
VB:
    With plage
        For Each cel In .Cells
            For i = 1 To w.Count
                If cel.DisplayFormat.Interior.Color = c(i, 0) Then c(i, 1) = c(i, 1) + 1
            Next
        Next
    End With
compte toutes les cellules de la plage étudiée comportant l'une des couleur susdites comme couleur d'affichage.

Tant qu'on reste dans le domaine d'application du code (i.e. une plage comportant uniquement une MFC uniforme à l'exclusion de mise en forme fixe (MFF)), pas de problème.

Dans votre cas, vous sortez du domaine d'application d'au moins deux façons :
  1. Vous ajoutez une MFF à une partie de la plage d'étude.
  2. Vous utiliser une MFC qui ne couvre pas toute la plage d'étude.

Conséquences :
  1. Si l'une des cellules de la plage comporte une couleur applicable à la première cellule de la plage par la MFC, elle est comptabilisée. C'est le cas des cellules rouges E3:E6 puisque le rouge est applicable par MFC à la première cellule de la plage.
  2. Vous avez eu de la chance d'obtenir un résultat ! Si vous aviez appliqué votre MFC à C3:D6 au lieu de B3:D6, la procédure aurait carrément planté...
    En effet, comme il n'y aurait plus eu de MFC en B3, première cellule de la plage étudiée,
    VB:
        ReDim c(1 To w.Count, 2)
    est impossible puisque w.Count serait zéro.

Conclusion de la chose : Le code universel n'existe pas, un code s'applique à une situation donnée.

Deuxième conclusion : Dans votre cas, ii faut du plus costaud qu'un code de démonstration pour novices. Ceci, par exemple :​
VB:
Sub toto(plage As Range, cellule As Range)
'Nécessite l'ajout de la bibliothèque Microsoft Scripting Runtime au projet.
Dim i, Tmp
Dim w, cel, Dic As New Scripting.Dictionary
    With plage
        For Each cel In .Cells
            Set w = cel.FormatConditions
            For i = 1 To w.Count
                If Not Dic.Exists(w(i).Interior.Color) Then Dic.Add w(i).Interior.Color, Array(0&, w(i).Font.Color)
                If cel.DisplayFormat.Interior.Color = w(i).Interior.Color Then
                    Tmp = Dic(w(i).Interior.Color)
                    Tmp(0) = 1 + Tmp(0)
                    Dic(w(i).Interior.Color) = Tmp
                End If
            Next
        Next
    End With
    ReDim Tmp(Dic.Count, 1)
    Tmp(0, 0) = "couleur": Tmp(0, 1) = "nombre"
    With cellule
        For i = 1 To Dic.Count
            .Offset(i).Interior.Color = Dic.Keys(i - 1)
            .Offset(i).Font.Color = Dic.Items(i - 1)(1)
            Tmp(i, 0) = Dic.Keys(i - 1)
            Tmp(i, 1) = Dic.Items(i - 1)(0)
        Next
    .Resize(1 + Dic.Count, 2).Value = Tmp
    End With
End Sub
Comme rien n'est parfait, il est probab' que ce code plantera dans certaines situations que je vous laisse le soin de découvrir.​


Bon courage.


ROGER2327
#6776


Vendredi 13 Phalle 140 (Sainte Bitre, ouvreuse et Etalon, couvreur - fête Suprême Quarte)
6 Fructidor An CCXXI, 4,5494h - tubéreuse
2013-W34-5T10:55:07Z
 

Discussions similaires