Compter le nombre de valeurs différentes selon une condition sur une autre colonne

antoinantoine

XLDnaute Nouveau
Bonjour,

Tout d'abord désolé si la question a déjà été posée, mais après une demi-heure sur google je n'arrive pas à trouver les bons mots pour trouver réponse à ma question.

J'essaye de compter le nombre de valeurs différentes sur une colonne, ce que j'arrive à faire sans condition, mais là j'aimerais ne compter que les valeurs correspondant à une autre valeur définie dans une autre colonne.

Par exemple disons que j'ai une colonne contenant des plats, genre omelette, pizza, pâtes, et une autre colonne contenant petit déjeuner, déjeuner, dîner. J'aimerais savoir combien de plats différents ont été mangés aux dîners.

Dans ma pièce jointe donc, j'aimerais obtenir 3 : deux fois de l'omelette, deux fois de la pizza, une fois du couscous = trois valeurs différentes. J'arrive à savoir qu'il y a 5 plats différents en tout mais pas à le calculer seulement pour le dîner.

Merci à ceux qui m'aideront !

Antoine
 

Pièces jointes

  • exemplerepas.xlsx
    13.3 KB · Affichages: 64

Victor21

XLDnaute Barbatruc
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

Bonjour, antoineantoine.

Essayez :
=SOMMEPROD(1/NB.SI(F8:F20;F8:F20)*(E8:E20="Dîner"))

Oubliez, j'ai commis une erreur :(
J'avais ajouté en F8:F19 la concaténation de D et E (=D8&E8)

Bonjour, Dugenou, Chris, Paf :)
 
Dernière édition:

Dugenou

XLDnaute Barbatruc
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

Patrick,
même avec les bonnes colonnes on obtient 1.5 mais pas 3.
Je n'y arrive pas sans colonne intermédiaire et pourtant possible c'est d'y parvenir
A te lire
 

Chris401

XLDnaute Accro
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

Bonjour

Essaye avec la matricielle :
Code:
=NB(1/FREQUENCE(SI(E8:E20="Dîner";EQUIV(D8:D20;D8:D20;0));LIGNE(INDIRECT("1:"&LIGNES(D8:D20)))))
Cordialement
Chris
 

Paf

XLDnaute Barbatruc
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

Bonjour antoinantoine, Victor21, Dugenou, edit: et Chris401


un essai par fonction personnalisée:

*- en E22 ( ou ailleurs): =PlatUnique($D$8:$E$20;"Dîner") ou =PlatUnique($D$8:$E$20;E9)

si on rentre la formule sans 2ème paramètre =PlatUnique($D$8:$E$20; ) on obtient le nombre de plats différents de la liste.


*- dans un module standard:

Code:
Function PlatUnique(Plage, Optional Repas)
 Dim Dico, x As Integer, Lig
 Set Dico = CreateObject("Scripting.Dictionary")
 x = Plage.Row - 1
 For Each Lig In Plage.Rows
    If IsMissing(Repas) Then
        Dico(CStr(Plage(Lig.Row - x, 1))) = ""
    Else
        If Plage(Lig.Row - x, 2) = Repas Then Dico(CStr(Plage(Lig.Row - x, 1))) = ""
    End If
 Next
 PlatUnique = Dico.Count
End Function

A+
 

antoinantoine

XLDnaute Nouveau
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

Ok, merci beaucoup, ça fonctionne avec la fonction personnalisée ! J'ai bêtement copié collé, je vais voir si je comprends en adaptant la fonction à mon autre fichier sur lequel tout est un peu plus compliqué.

Merci beaucoup à tous pour votre aide !
 

antoinantoine

XLDnaute Nouveau
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

... Je n'y arrive pas. Je comprends rapidement la programmation, j'ai fait du pseudo-code et du Matlab, mais je ne connais que très mal le langage VBA encore moins appliqué à Excel. Je comprends le squelette de cette fonction mais pas les détails (qui est Lig, que fait dico, que fait .Rows... entre autre...

Encore merci
 

Paf

XLDnaute Barbatruc
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

re,

décorticage:

Set Dico = CreateObject("Scripting.Dictionary") définition d'un objet dictionary qui a la particularité de ne conserver que des clés uniques même si on lui insère des doublons.
x = Plage.Row - 1 plage.row contient le n° de ligne dans la feuille de la plage, soit 8 dans l'exemple; or plus loin on a besoin de connaitre le contenu de la plage à partir de sa ligne 1 (qui se trouve en ligne 8 de la feuille) .donc 8-7(variable x)= 1
For Each Lig In Plage.Rows pour chaque ligne de la plage
If IsMissing(Repas) Then si le paramètre Repas est manquant
Dico(CStr(Plage(Lig.Row - x, 1))) = "" on insère dans le dico l'élément de la ligne(lig.row qui vaut 8 - x qui vaut 7 donc 1 pour le premier passage, puis 2....) et de la colonne 1 de la plage
Else sinon (si le parametre n'est pas manquant)
If Plage(Lig.Row - x, 2) = Repas Then Dico(CStr(Plage(Lig.Row - x, 1))) = "" si l'élément de la 2ème colonne = le repas cherché, on insère l'élément de la première colonne
End If
Next
PlatUnique = Dico.Count la fonction retourne le nombre de clés du dictionnaire

en espérant avoir été clair

A+
 

Paf

XLDnaute Barbatruc
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

re,re

c'aurait été beaucoup plus clair comme ceci

Code:
Function PlatUnique(Plage, Optional Repas)
 Dim Dico, Lig
 Set Dico = CreateObject("Scripting.Dictionary")
 For Each Lig In Plage.Rows
    If IsMissing(Repas) Then
        Dico(CStr(Lig.Cells(1, 1))) = ""
    Else
        If Lig.Cells(1, 2) = Repas Then Dico(CStr(Lig.Cells(1, 1))) = ""
    End If
 Next
 PlatUnique = Dico.Count
End Function

où :
Plage.Rows est l'ensemble des lignes de la plage, Lig est donc une ligne
et Lig.Cells(1, 1) est le contenu de la première colonne de la ligne Lig
et Lig.Cells(1, 2) est le contenu de la deuxième colonne de la ligne Lig

A+
 

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de valeurs différentes selon une condition sur une autre colon

Bonjour

Tu peux aussi faire avec
Code:
=SOMME(1*(EQUIV(SI(E8:E20="Dîner";D8:D20);SI(E8:E20="Dîner";D8:D20);0)=(E8:E20="Dîner")*(LIGNE(E8:E20)-7)))
ou encore avec
Code:
=SOMME((E8:E20="Dîner")*(EQUIV(SI(E8:E20="Dîner";D8:D20);SI(E8:E20="Dîner";D8:D20);0)=(LIGNE(E8:E20)-7)))

les deux en matriciel, donc à valider avec Ctrl+maj+entrer.

@ plus
 

R@chid

XLDnaute Barbatruc
Bonjour le forum,
Bonjour cyberdico,
Une formule matricielle à valider par Ctrl+Shift+Enter et à tirer vers la droite.
Code:
=NB(1/FREQUENCE(SI($B$2:$B$21=D29;$A$2:$A$21);$A$2:$A$21))

Voir PJ


Cordialement
 

Pièces jointes

  • NbreOccurences.xls
    30 KB · Affichages: 2

cyberdico

XLDnaute Nouveau
Bonjour R@chid,

Merci pour la réponse mais je me suis rendu compte dans mon exemple que mes données sont du texte alors la formule ne fonctionne. Je vous joint le fichier à nouveau avec des données texte.

Merci encore une fois pour votre aide
 

Pièces jointes

  • NbreOccurences.xls
    30 KB · Affichages: 3

Discussions similaires

Statistiques des forums

Discussions
312 203
Messages
2 086 191
Membres
103 152
dernier inscrit
Karibu