Ratio des cellules par couleur
Bonjour,
Je suis en train de travailler sur un baromètre (résultat d'une enquête mené auprès de nos clients). J'ai une colonne de plus de 20000 lignes de commentaires et suggestions de nos clients. Après un rapide survol, j'ai noté les 5 grands thèmes les plus récurrents. Je voudrais faire un ratio de ces pour chacun de ces thèmes, ce qui me permettra de dire par exemple : "sur 20000 répondants, 25% trouvent que le conditionnement des produits laisse à désirer, 45% trouvent le SAV peu efficace...".
Le moyen le plus simple qui m'est venu à l'idée (je reste ouvert à toute autre proposition plus simple) est d’établir une couleur pour chaque thématique (rouge pour qualité SAV, bleu pour conditionnement...) et de colorier les cellules en fonction de la thématique auxquelles elles se rapportent. A l'issu de cela, compter le nombre de cellule rouge, bleu... pour faire les ratios.
Mon problème est que compter les cellules manuellement va me prendre un temps fou sans compter le risque d'erreur. Je voudrais donc savoir s'il y a une formule simple qui pourra me calculer le pourcentage de cellule rouge, bleu... dans la colonne des commentaires.
J'ai essayé d’être le plus explicite possible afin de vous aider à m'aider
Merci d'avance!
Cordialement!
bonjour
met une maquette de ton ouvrage pour voir la structure parce qu'a loccasion les couleurs seront inutiles ;il suffira de compter en fonction du critere theme et des sous criteres (satisfaction)
ps : avec 20000 lignes => vba
cordialement
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Salut
Si j'ai bien compris, il faut compter les cellules d'une même couleur :
Dans excel:
ouvrir l'editeur de MAcro (ALT+F11)
Dans la partie de gauche, click droit sur Feuil1
Selectionner Insertion -> Module
Coller le code suivant :
Function NBcouleur(code_couleur As Integer, plage As Range) As Double
Dim c As Range
Dim compteur As Double
For Each c In plage
If c.Cells.Interior.ColorIndex = code_couleur Then
compteur = compteur + 1
End If
Next
NBcouleur = compteur
End FunctionPuis dans excel on pourra utiliser la formule comme suit :
=nbcouleur(6;G3:G23) Ou 6 est le code couleur pour le jaune.
Si tu ne connais pas le code de tes couleurs, copier a la suite du code ci dessus le code suivant :
Function trouvecouleur(cellule As Range) As Integer
trouvecouleur = cellule.Interior.ColorIndex
End FunctionDans Excel tu utiliseras la fonction :
=trouvecouleur(G3)
qui te renverra la valeur 6 pour le jaune (exemple)
Après, pour faire le pourcentage, il suffit juste de compter le nombre total de ligne
Ca ta va ?
La calcul du nombre de couleurs marche bien lorsqu'il s'agit de couleurs issues de la fonction "format cellule"/"Remplissage".
Mais lorsque la couleur provient d'une mise en forme conditionnelle, il y a un problème. Si la mise en forme conditionnelle donne la couleur rouge ( normalement code "43" issu de "trouvecouleur"), "trouve couleur" donne "-4142" qui semble plutôt être le code de la mise en forme conditionnelle.
Comment peut-on faire pour ne récupérer que la couleur de cette mise en forme conditionnelle? L'idée étant de compter toutes les cellules pour lesquelles la mise en forme conditionnelles donne une couleur donnée?
D'avance merci
bonjour
pour traiter ce qui est issu de MFC c'est hyper compliqué ............
tu pourrais eventuellement te rabattre sur le comptage du critere de mfc
soit somme.couleur + nb.si ( plge; critere) cela peut etre nb.si ou autre
cordialement
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Salut
Y a qqun qui a deja traité le sujet, (et oui c'est compliqué...)
http://www.cpearson.com/excel/CFColors.htm
Je ne sais pas si j'ai le droit de donner ce lien....
En utilisant la fomule :
=ColorIndexOfCF(B4) alors on retrouve le bon code couleur (issue ou non d'une mise en forme automatique.)
Il faut donc changer le code pour que cela fonctionne :
Function NBcouleur(code_couleur As Integer, plage As Range) As Double
Dim c As Range
Dim compteur As Double
For Each c In plage
If ColorIndexOfCF(c) = code_couleur Then
compteur = compteur + 1
End If
Next
NBcouleur = compteur
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function ActiveCondition(Rng As Range) As Integer
Dim Ndx As Long
Dim FC As FormatCondition
Dim Temp As Variant
Dim Temp2 As Variant
If Rng.FormatConditions.Count = 0 Then
ActiveCondition = 0
Else
For Ndx = 1 To Rng.FormatConditions.Count
Set FC = Rng.FormatConditions(Ndx)
Select Case FC.Type
Case xlCellValue
Select Case FC.Operator
Case xlBetween
Temp = GetStrippedValue(FC.Formula1)
Temp2 = GetStrippedValue(FC.Formula2)
If IsNumeric(Temp) Then
If CDbl(Rng.Value) >= CDbl(FC.Formula1) And _
CDbl(Rng.Value) <= CDbl(FC.Formula2) Then
ActiveCondition = Ndx
Exit Function
End If
Else
If Rng.Value >= Temp And _
Rng.Value <= Temp2 Then
ActiveCondition = Ndx
Exit Function
End If
End If
Case xlGreater
Temp = GetStrippedValue(FC.Formula1)
If IsNumeric(Temp) Then
If CDbl(Rng.Value) > CDbl(FC.Formula1) Then
ActiveCondition = Ndx
Exit Function
End If
Else
If Rng.Value > Temp Then
ActiveCondition = Ndx
Exit Function
End If
End If
Case xlEqual
Temp = GetStrippedValue(FC.Formula1)
If IsNumeric(Temp) Then
If CDbl(Rng.Value) = CDbl(FC.Formula1) Then
ActiveCondition = Ndx
Exit Function
End If
Else
If Temp = Rng.Value Then
ActiveCondition = Ndx
Exit Function
End If
End If
Case xlGreaterEqual
Temp = GetStrippedValue(FC.Formula1)
If IsNumeric(Temp) Then
If CDbl(Rng.Value) >= CDbl(FC.Formula1) Then
ActiveCondition = Ndx
Exit Function
End If
Else
If Rng.Value >= Temp Then
ActiveCondition = Ndx
Exit Function
End If
End If
Case xlLess
Temp = GetStrippedValue(FC.Formula1)
If IsNumeric(Temp) Then
If CDbl(Rng.Value) < CDbl(FC.Formula1) Then
ActiveCondition = Ndx
Exit Function
End If
Else
If Rng.Value < Temp Then
ActiveCondition = Ndx
Exit Function
End If
End If
Case xlLessEqual
Temp = GetStrippedValue(FC.Formula1)
If IsNumeric(Temp) Then
If CDbl(Rng.Value) <= CDbl(FC.Formula1) Then
ActiveCondition = Ndx
Exit Function
End If
Else
If Rng.Value <= Temp Then
ActiveCondition = Ndx
Exit Function
End If
End If
Case xlNotEqual
Temp = GetStrippedValue(FC.Formula1)
If IsNumeric(Temp) Then
If CDbl(Rng.Value) <> CDbl(FC.Formula1) Then
ActiveCondition = Ndx
Exit Function
End If
Else
If Temp <> Rng.Value Then
ActiveCondition = Ndx
Exit Function
End If
End If
Case xlNotBetween
Temp = GetStrippedValue(FC.Formula1)
Temp2 = GetStrippedValue(FC.Formula2)
If IsNumeric(Temp) Then
If Not (CDbl(Rng.Value) <= CDbl(FC.Formula1)) And _
(CDbl(Rng.Value) >= CDbl(FC.Formula2)) Then
ActiveCondition = Ndx
Exit Function
End If
Else
If Not Rng.Value <= Temp And _
Rng.Value >= Temp2 Then
ActiveCondition = Ndx
Exit Function
End If
End If
Case Else
Debug.Print "UNKNOWN OPERATOR"
End Select
Case xlExpression
If Application.Evaluate(FC.Formula1) Then
ActiveCondition = Ndx
Exit Function
End If
Case Else
Debug.Print "UNKNOWN TYPE"
End Select
Next Ndx
End If
ActiveCondition = 0
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function ColorIndexOfCF(Rng As Range, _
Optional OfText As Boolean = False) As Integer
Dim AC As Integer
AC = ActiveCondition(Rng)
If AC = 0 Then
If OfText = True Then
ColorIndexOfCF = Rng.Font.ColorIndex
Else
ColorIndexOfCF = Rng.Interior.ColorIndex
End If
Else
If OfText = True Then
ColorIndexOfCF = Rng.FormatConditions(AC).Font.ColorIndex
Else
ColorIndexOfCF = Rng.FormatConditions(AC).Interior.ColorIndex
End If
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function GetStrippedValue(CF As String) As String
Dim Temp As String
If InStr(1, CF, "=", vbTextCompare) Then
Temp = Mid(CF, 3, Len(CF) - 3)
If Left(Temp, 1) = "=" Then
Temp = Mid(Temp, 2)
End If
Else
Temp = CF
End If
GetStrippedValue = Temp
End FunctionDis moi si cela te convient ?
Damien