Compter le nombre de cellules d'une MFC

Bonjour à tous,

Je lance un nouveau sujet qui à déjà été abordé sur le forum mais je n'arrive pas à m'en sortir et sollicite votre aide :

J'ai bien compris que ce que je souhaite faire est plus ou moins impossible via VBA, la couleur d'une MFC n'étant pas récupérable.

Par formule classique, il me faut réutiliser les conditions de la MFC pour faire une somme. C'est la ou je sèche...

Dans mon cas, la MFC me sert à réaliser un planning.

Chaque ligne de planning correspond à 1x personne et je souhaite faire la sommes des lignes en bas de feuille pour connaitre l'effectif total par jour. Ci-joint le fichier utilisé pour que vous puissiez étudier le sujet plus facilement.

Je pense avoir la bonne idée mais n'arrive pas à la mettre en oeuvre. Si quelqu'un peut m'éclairer...

Merci d'avance et bonne journée

Bonjour

J'ai bien compris que ce que je souhaite faire est plus ou moins impossible via VBA, la couleur d'une MFC n'étant pas récupérable.

Si avec

 cellule.DisplayFormat.Interior.Color

à condition de l'utiliser dans une Sub et non une Function

Cependant le changement des couleurs n'étant pas un évènement il y a toujours un risque d'erreur dans le décompte...

Salut Moka,

essaie avec cette fonction:

Function compteCoulMFC(champ As Range, coul)
  Application.Volatile
  For Each c In champ
   If CouleurMFC(c) = coul Then
       t = t + 1
   End If
  Next c
compteCoulMFC = t
End Function

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

Salut m3ellem1,

Désolé mais je suis perdu pour l'utilisation des tes fonctions... comment je les adaptes à mon cas?

il faut ajouter le code dans un module et aprés il suffit de mettre les formules dans les céllules

=compteCoulMFC(champ;coul)

par exemple, caluler le nombres des céllules rouges dans A1:A10

=compteCoulMFC(A1:A10;3)

@+++

C'est effectivement ce que j'ai fais mais j'ai une erreur #VALEUR!

Chaque fonction (il y en a 2 si je suis bien) dois avoir un module différent?

Est ce que comme le dis 78chris, le fait que tu fasses appel à des fonctions et non pas des sub pose problème?

RE

Est ce que comme le dis 78chris, le fait que tu fasses appel à des fonctions et non pas des sub pose problème?

Je parlais de seulement

cellule.DisplayFormat.Interior.Color

, qui évite l'analyse des conditions et formats associés

Bonjour à tous,

si j'ai bien compris, pour le violet, en K29 :

=SOMMEPROD((K5>=$G$9:$G$28)*(K5<=$H$9:$H$28))

à tirer vers la droite.

eric

Bonjour Eriic,

Merci, ça fonctionne nickel et sans VBA du coup!

J'avais essayé cette méthode mais sans succès. Pour ma culture, je ne comprends pas le signe * dans la formule :

=SOMMEPROD((K5>=$G$9:$G$28)*(K5<=$H$9:$H$28))

Peux tu stp m'indiquer comment est interpréter cette formule vis à vis de l'instruction SOMMEPROD?

Merci beaucoup à tous pour votre temps!

K5>=$G$9:$G$28 te crée une matrice de résultat de tests {VRAI;VRAI;FAUX;VRAI;...}

Multiplier 2 telles matrices revient à faire un ET logique entre elles.

Le sommeprod() te compte les VRAI, donc les 2 tests positifs.

Quand tu ne comprend pas une formule sélectionne un bout dans la barre d'édition et fais F9 dessus.

Excel te l'évalue et tu continues morceau par morceau.

Tu as aussi l'outil Formule / Evaluer une formule pour l'étudier pas à pas qui peut te servir

eric

Merci Eriic pour ces précisions j'y vois effectivement plus clair avec l'évaluation pas à pas.

C'est le ET logique avec la multiplication des 2 matrices que je ne pigeait pas...

Encore un grand merci et une bonne soirée !

En algèbre de Boole * = ET, + = OU

Rechercher des sujets similaires à "compter nombre mfc"