nombre de valeurs distinctes dans une liste [Excel] - Logiciels - Windows & Software
Marsh Posté le 24-06-2005 à 17:40:07
ta "liste", dans une seule cellule ou pas ?
Marsh Posté le 24-06-2005 à 17:52:28
mis à part un script en vba, je vois pas
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
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 pour appeler la fenêtre de sélection de fonctions
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)
Et c'est tout. Tu obtiens le nombre de cellules contenant une valeur
Et cela, sans VBA C'est quand mêmme plus pratique, non
A+
Marsh Posté le 24-06-2005 à 20:58:37
Papy Octet a écrit : Salut, |
EN utilisant nbval(), tu montres que t'as rien compris au sujet
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
Marsh Posté le 24-06-2005 à 22:46:31
Calme-toi un peu.
Pas besoin d'être si disgracieux ni de mettre rien en gras
C'est toi qui a besoin d'aide
Malgré cela, je ne suis pas rencunier et donc voici une proposition de solution en VBA :
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+
Marsh Posté le 24-06-2005 à 23:27:41
Papy Octet a écrit : Calme-toi un peu. |
Euh... qui a commencé ?
Sinon pour le vba !
Marsh Posté le 25-06-2005 à 08:32:08
Papy Octet a écrit : |
non c'était moi
merci à vous deux en tout cas
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+
Marsh Posté le 25-06-2005 à 20:42:31
Papy Octet a écrit : Ok Reivax59 |
il est possible que ce soit le cas en effet
Marsh Posté le 26-06-2005 à 17:05:38
reivax59 a écrit : il est possible que ce soit le cas en effet |
Voilà, on arrive
Comme toujours en informatique,
voici une solution à ton problème
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 ***********
Je pense qu'elle est suffisament documentée pour comprendre son déroulement
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.
A+
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
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
---------------
Strava