[Excel] nombre de valeurs distinctes dans une liste

nombre de valeurs distinctes dans une liste [Excel] - Logiciels - Windows & Software

Marsh Posté le 24-06-2005 à 17:38:27    

Est-il possible sous Excel d'avoir une formule donnant le nombre de valeurs d'une liste en prenant en compte les doublons?  
 
Je m'explique : pour la liste 2;1;25;52;1;52;52, je veux que la réponse soit 4
 
merci d'avance au pros de la forule en tout genre :D


---------------
Strava
Reply

Marsh Posté le 24-06-2005 à 17:38:27   

Reply

Marsh Posté le 24-06-2005 à 17:40:07    

ta "liste", dans une seule cellule ou pas ?


---------------
Filmstory : gardez trace des films que vous avez vu ! :D
Reply

Marsh Posté le 24-06-2005 à 17:41:33    

non dans une colonne, un nombre par cellule


---------------
Strava
Reply

Marsh Posté le 24-06-2005 à 17:52:28    

mis à part un script en vba, je vois pas :/


---------------
Filmstory : gardez trace des films que vous avez vu ! :D
Reply

Marsh Posté le 24-06-2005 à 20:18:42    

et ce script ça donnerait... ?
 
 [:nikko] si qqun a une autre idée


---------------
Strava
Reply

Marsh Posté le 24-06-2005 à 20:33:33    

Salut,
 
C'est facile :
1. Tu te positionnes dans la cellule où tu veux qu'apparaisse le nombre de cellules qui contiennet une valeur :sol:  
2. Tu vas dans la ligne de saisie à la droite du symbole Fx : la ligne qui affiche le contenu de la cellule sélectionnée et tu cliques sur le symbole Fx :hello: pour appeler la fenêtre de sélection de fonctions :hello:  
3. Dans la catégorie "Statistiques", tu fais défiler jusqu'à "NBVal".
4. Tu sélectionnes cette fonction puis tu suis les directives : tu défini la zone de cellules à contrôler (A1:A15) ou (A3:C17) ou (A1;A3;A5;C15;D8) :pt1cable:  
 
Et c'est tout. Tu obtiens le nombre de cellules contenant une valeur :bounce:  
 
Et cela, sans VBA :lol: C'est quand mêmme plus pratique, non :jap:  
 
A+

Reply

Marsh Posté le 24-06-2005 à 20:58:37    

Papy Octet a écrit :

Salut,
 
C'est facile :
1. Tu te positionnes dans la cellule où tu veux qu'apparaisse le nombre de cellules qui contiennet une valeur :sol:  
2. Tu vas dans la ligne de saisie à la droite du symbole Fx : la ligne qui affiche le contenu de la cellule sélectionnée et tu cliques sur le symbole Fx :hello: pour appeler la fenêtre de sélection de fonctions :hello:  
3. Dans la catégorie "Statistiques", tu fais défiler jusqu'à "NBVal".
4. Tu sélectionnes cette fonction puis tu suis les directives : tu défini la zone de cellules à contrôler (A1:A15) ou (A3:C17) ou (A1;A3;A5;C15;D8) :pt1cable:  
 
Et c'est tout. Tu obtiens le nombre de cellules contenant une valeur :bounce:  
 
Et cela, sans VBA :lol: C'est quand mêmme plus pratique, non :jap:  
 
A+


 
EN utilisant nbval(), tu montres que t'as rien compris au sujet :lol:
 

Citation :

Je m'explique : pour la liste 2;1;25;52;1;52;52, je veux que la réponse soit 4


2, 1, 25, et 52 :hello:


Message édité par freds45 le 24-06-2005 à 21:04:53

---------------
Filmstory : gardez trace des films que vous avez vu ! :D
Reply

Marsh Posté le 24-06-2005 à 22:46:31    

Calme-toi un peu. :pt1cable:  
Pas besoin d'être si disgracieux ni de mettre rien en gras :kaola:  
C'est toi qui a besoin d'aide :kaola:  :kaola:  
 
Malgré cela, je ne suis pas rencunier et donc voici une proposition de solution en VBA : :jap:  
 

Sub NbValDiff()
'compte le nombre de valeurs différentes dans une zone
'de cellules
Dim Li, Col, Cpt, Buf1, Buf2, I, J, K
Col = 1
Li = 1
Cpt = 0
 
'Il faut trier les cellules par ordre croissant ... ou décroissant
'ça n'a pas d'importance, ce qui compte c'est le tri des valeurs.
'Dans cet exemple, on teste sur 6 cellules.
 
Range("A1:A6" ).Select
    Selection.Sort Key1:=Range("A1" ), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    Range("A7" ).Select
     
Do  'Répéter les opérations ci-dessous
    Buf1 = ActiveSheet.Cells(Li, Col).Value 'enregistrer la valeur contenue dans la cellule
    Cpt = Cpt + 1   'incrémenter le compteur
    Do While ActiveSheet.Cells(Li, Col) = Buf1  'Tant qu'on trouve la même valeur que celle enregistrée dans Buf1
        Li = Li + 1 'on passe à la ligne suivante
    Loop    'On boucle tant qu'on a la même valeur que celle dans Buf1
Loop Until Li > 6   'tant que le numéro de ligne n'est pas supérieur à 6
 
ActiveSheet.Cells(7, 1).Value = Cpt 'On affiche le résultat
 
End Sub

 
A+ :hello:

Reply

Marsh Posté le 24-06-2005 à 23:27:41    

Papy Octet a écrit :

Calme-toi un peu. :pt1cable:  
Pas besoin d'être si disgracieux ni de mettre rien en gras :kaola:  
C'est toi qui a besoin d'aide :kaola:  :kaola:  


 
Euh... qui a commencé ;) ?
 
Sinon :jap: pour le vba !


---------------
Filmstory : gardez trace des films que vous avez vu ! :D
Reply

Marsh Posté le 25-06-2005 à 08:32:08    

Papy Octet a écrit :


 
[...]
 
C'est toi qui a besoin d'aide :kaola:  :kaola:  
 
[...]
 


 
non c'était moi :D  
 
merci à vous deux en tout cas [:al_bundy]


Message édité par reivax59 le 25-06-2005 à 08:32:37

---------------
Strava
Reply

Marsh Posté le 25-06-2005 à 08:32:08   

Reply

Marsh Posté le 25-06-2005 à 11:27:40    

Ok Reivax59
J'espère que ma proposition répond à ta question.
Si tu utilise une liste d'enregistrements de taille variable, alors il faudra prévoir du code pour déterminer le nombre d'enregistrements à analyser avant de lancer le tri.
 
Tiens-moi au courant si tu es dans le cas.
 
A+

Reply

Marsh Posté le 25-06-2005 à 20:42:31    

Papy Octet a écrit :

Ok Reivax59
J'espère que ma proposition répond à ta question.
Si tu utilise une liste d'enregistrements de taille variable, alors il faudra prévoir du code pour déterminer le nombre d'enregistrements à analyser avant de lancer le tri.
 
Tiens-moi au courant si tu es dans le cas.
 
A+


 
il est possible que ce soit le cas en effet  :sarcastic:  


---------------
Strava
Reply

Marsh Posté le 26-06-2005 à 09:16:05    

Ok reivax59,
 
On bosse dessus :pt1cable:

Reply

Marsh Posté le 26-06-2005 à 17:05:38    

reivax59 a écrit :

il est possible que ce soit le cas en effet  :sarcastic:


 
Voilà, on arrive :pt1cable:  :pt1cable:  
 
Comme toujours en informatique,
voici une solution à ton problème :sweat:  
 
Pour l'activer une fois que tu l'auras copiée dans VBA,
tu placeras un bouton (Barre d'outils Formulaire) sur ta feuille excel,
Tu relieras ce bouton à la macro qui porte le nom de la procédure ci-dessous,
Quand tu cliques sur ce bouton, tu exécutes la procédure.
 
'********* Copier depuis ici ***********
Sub CptDiffVal()
'Compte le nombre de valeurs différentes contenues dans une colonne.
Dim Li, Col, Buf1, Cpt1, CptLi, CptCol, I, J, K
 
'Si la colonne à analyser ne commence pas à la ligne 3 de la colonne 1,
'changer les valeurs de Li et Col ci-dessous.
'------- !!! ATTENTION !!!
'---   Il ne faut pas de cellule vide dans la ligne n° 3
'---   ni dans la colonne n°1 dans cet exemple
Li = 3  'N° de la ligne où la liste des valeurs à compter commence
Col = 1 'N° de la colonne où la liste des valeurs à compter commence
 
'Initialiser les variables
CptLi = 0
CptCol = 0
Cpt1 = 0
 
'------------------------------------------------------------------------
'---   S'il y a, par exemple une ligne pour le titre des colonnes
'---   et une seconde ligne pour séparer les titres des données, par exemple,
'---   alors les données commencent à la ligne 3 de la colonne 1
CptLi = 0
CptCol = 0
'---   Le raisonnement est le même s'il y a des nomls de lignes dans la 1° colonne
'---   Compter le nombre de lignes à analyser
For I = Li To 65535
    If IsEmpty(ActiveSheet.Cells(I, Col)) = False Then
        CptLi = CptLi + 1
    Else
        Exit For
    End If
Next I
'---   Compter le nombre de colonnes à analyser
For J = Col To 65535
    If IsEmpty(ActiveSheet.Cells(Li, J)) = False Then
        CptCol = CptCol + 1
    Else
        Exit For
    End If
Next J
'-------------------------------------------------------------------------
'Trier l'ensemble des cellules par ordre croissant
'---    'Sélection de la zone à trier par ordre croissant
ActiveSheet.Range(Cells(Li, Col), Cells((Li - 1) + CptLi, (Col - 1) + CptCol)).Select
'---    'Trier la zone de cellules par ordre croissant
Selection.Sort Key1:=ActiveSheet.Cells(Li, Col), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
'---    'Se positionner sur une cellule
ActiveSheet.Cells(Li, Col).Select
 
'Compter le nombre de valeurs différentes contenues dans la colonne choisie
Buf1 = ActiveSheet.Cells(Li, Col).Value
Cpt1 = 1
For K = Li To (Li - 1) + CptLi 'Lire chaque cellule de la colonne
    '---   'Si une valeur différente de la précédante dans la cellule visitée
    If ActiveSheet.Cells(K, Col) <> Buf1 Then
        Cpt1 = Cpt1 + 1 'Incrémenter le compteur
        Buf1 = ActiveSheet.Cells(K, Col).Value
    End If
Next K
 
ActiveSheet.Cells(K, Col).Value = Cpt1  'Récupère le nombre de valeurs différentes
 
End Sub
'********* Copier jusqu'ici ***********
 
 :sweat:  :sweat:  
 
Je pense qu'elle est suffisament documentée pour comprendre son déroulement :hello:  
 
Pour celui qui souhaite la voir fonctionner ligne par ligne,
depuis l'éditeur VBA, faire F8, la ligne exécutée est surlignée en jaune.
Vous pouvez aller voir le résultat dans votre feuille Excel après chaque ligne de code exécutée. :jap:  
 
A+ :pt1cable:  

Reply

Marsh Posté le 26-06-2005 à 20:05:18    

et ben ... chapeau bas. :jap:
 
merci beaucoup...


---------------
Strava
Reply

Marsh Posté le 26-06-2005 à 20:42:22    

It's nothing, my dear.
I was happy to help you !!!

Reply

Marsh Posté le 16-02-2013 à 14:29:32    

Bonjour,
 
Je me permet de déterrer ce post parce que j’ai eu ce même défi aujourd’hui avec en bonus : « sans macro svp ! »
J’ai finalement trouvé la solution suivante : la somme de l’inverse du nombre d’occurrence...
On calcule le nombre d’occurrence d’une donnée dans la colonne, et on somme son inverse, ce pour chaque cellule de la plage.
 
Si on a la donnée une fois on fait 1/1 = 1
Si on l’a deux fois on fait ½ + ½ = 1
Si on l’a trois fois on fait 1/3 + 1/3 + 1/3 = 1

 
Du coup, pour chaque entrée unique on obtient une somme de 1.
En les sommant toute, on obtient le nombre d’entrées différentes dans la plage.
 
Sous la forme d’une formule matricielle, ça tient en une petite formule (B2 :B8 étant ma plage de données):
=SOMME(1/NB.SI(B2:B8;B2:B8))             (Ctrl+Maj+Enter)
En espérant aider d’autre personnes
 
Cordialement

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed