Comment compter le nombre de valeurs distinctes dans une plage?

32

J'ai un grand tableau qui est déjà organisé à l'aide de filtres, etc. J'aimerais ajouter un résumé sous certaines colonnes contenant le nombre de valeurs distinctes dans cette colonne.

Il n'y a pas de fonction =COUNTDISTINCT(A2:A100)alors que puis-je faire à la place? (Excel 2003)

Je ne peux pas utiliser exactement les réponses à cette question car je ne souhaite pas modifier le tableau ni le filtrage. J'ai besoin d'un ajout dans la feuille de travail, pas d'une modification .

Torben Gundtofte-Bruun
la source

Réponses:

31
=SUMPRODUCT((A2:A100 <> "")/COUNTIF(A2:A100,A2:A100 & ""))

le fera sans avoir à utiliser une formule matricielle.

Lance Roberts
la source
4
Comment / pourquoi ça marche ???
RBarryYoung
4
@RBarryYoung, SOMMEPROD fonctionne comme une fonction Array sans en être une. Bien qu'il puisse faire beaucoup plus que ce qui est utilisé ici, ici, il ne fait que vérifier chaque instance d'une colonne et générer une valeur mise à l'échelle pour chaque valeur distincte en fonction du nombre d'itérations dans la colonne. Donc, s'il y avait deux occurrences de 'a', cela ajouterait 1/2 et 1/2 pour obtenir 1. Donc, pour chaque valeur distincte, vous ajouterez un à la somme.
Lance Roberts
1
C'est la partie qui me pose problème: " trouver une valeur proportionnée pour chaque valeur distincte en fonction du nombre d'itérations dans la colonne. " Si je comprends cela, alors SUMPRODUCT exécute effectivement une boucle comme for each [i] in A2:A100 DO:{ sum += (([i]<>"")/COUNTIF(A2:A100,[i])) }, à droite ? J'ai un peu de difficulté à comprendre comment il sait énumérer les paramètres conditionnel et 2nd COUNTIF, mais pas le paramètre 1st COUNTIF? Cette magie DWIM est-elle documentée / expliquée n'importe où par MS? Ce serait bien de savoir comment écrire ces mots intentionnellement.
RBarryYoung
1
Oui, vous l'avez, cela itère un tableau pour ce qui serait normalement une seule valeur, en multipliant tous ses paramètres (qui dans ce cas est juste 1), puis en ajoutant les itérations. Les sous-produits peuvent devenir très complexes, mais c’est l’une des fonctions les plus utiles d’Excel, il peut faire des miracles littéraux.
Lance Roberts
4
Cela échoue si l'entrée contient des entrées vides. Solution facile comme demoed sur youtube est la suivante: =SUMPRODUCT((A2:A100<>"")/COUNTIF(A2:A100,A2:A100&"")). Cela garantit que le COUNTIFretourne jamais un 0 pour les lignes vides, ce qui entraînerait une DIV/0erreur.
cfi
7

J'ai trouvé une solution ici qui semble être un moyen détourné incroyable pour la résoudre. Mais bon, ça marche ...

= SOMME (IF (COUNTIF (A2: A100, A2: A100) = 0, "", 1 / COUNTIF (A2: A100, A2: A100)))

puis appuyez sur Ctrl+ Shift+ Enter. En appuyant uniquement, vous Enterobtiendrez un résultat erroné.

Torben Gundtofte-Bruun
la source
J'aimerais voir d'autres réponses! Y at-il un meilleur moyen que cela pour le résoudre?
Torben Gundtofte-Bruun
1
Non, c'est la meilleure façon. Je ne sais pas pourquoi il y a un SI. Vous pouvez simplement utiliser le tableau = SUM (1 / COUNTIF (A2: A100, A2: A100))
dkusleika
2
@dkusleika Le SI semble être là pour empêcher une division par zéro erreur. Comme mentionné sur la page liée à ci-dessus, cela est nécessaire si la plage contient des cellules vides, sinon vous pouvez laisser le IF si.
Bavi_H
1

Cet article montre ceci pour les valeurs de texte:

=SUM(IF(FREQUENCY(IF(LEN(C3:C25)>0,MATCH(C3:C25,C3:C25,0),""), IF(LEN(C3:C25)>0,MATCH(C3:C25,C3:C25,0),""))>0,1))

et ceci pour les valeurs numériques:

=SUM(IF(FREQUENCY(C3:C25, C3:C25)>0,1))

Cet article présente des formules similaires, mais présente également une méthode utilisant des filtres.

Compter le nombre de valeurs uniques à l'aide d'un filtre

Vous pouvez utiliser le filtre avancé pour extraire les valeurs uniques d'une colonne de données et les coller dans un nouvel emplacement. Ensuite, vous pouvez utiliser la fonction ROWS pour compter le nombre d'éléments de la nouvelle plage.

  1. Assurez-vous que la première ligne de la colonne a un en-tête de colonne.
  2. Dans le menu Données, pointez sur Filtrer, puis cliquez sur Filtre avancé.
  3. Dans la boîte de dialogue Filtre avancé, cliquez sur Copier vers un autre emplacement.
  4. Si la plage que vous comptez n'est pas déjà sélectionnée, supprimez les informations de la zone Plage de la liste, puis cliquez sur la colonne (ou sélectionnez la plage) contenant vos données.
  5. Dans la zone Copier dans, supprimez les informations de la zone ou cliquez dessus, puis cliquez sur une colonne vide dans laquelle vous souhaitez copier les valeurs uniques.
  6. Cochez la case Enregistrement unique uniquement, puis cliquez sur OK.

    Les valeurs uniques de la plage sélectionnée sont copiées dans la nouvelle colonne.

  7. Dans la cellule vide en dessous de la dernière cellule de la plage, entrez la fonction ROWS. Utilisez la plage de valeurs uniques que vous venez de copier comme argument. Par exemple, si la plage de valeurs uniques est B1: B45, entrez:
    = ROWS (B1: B45)

En pause jusqu'à nouvel ordre.
la source
1

= SUM (1 / COUNTIF (A2: A100; A2: A100))

Confirmez avec Ctrl + Maj + Entrée

Pour chaque cellule, il compte le nombre de fois où il se produit et additionne les inverses de toutes ces valeurs. Supposons qu'une chaîne ou un nombre se trouve 5 fois. Son inverse est 0.2 qui est additionné 5 fois, donc 1 est ajouté. En fin de compte, il donne le nombre de valeurs différentes.

Remarque: ne fonctionne pas lorsque des blancs apparaissent!

utilisateur221470
la source
0

Essayez ce lien. Cela montre comment compter les valeurs uniques dans une liste en omettant les cellules vides.

http://www.functioninexcel.com/lists-arrays/count-unique-values-in-a-list/

= somme (si (fréquence (correspondance (Liste, Liste, 0), correspondance (Liste, Liste, 0))> 0, 1))

Où "Liste" est votre gamme de cellules par exemple:

List = $ A $ 2: $ A $ 12 OR- Liste = offset ($ A $ 1 ,,, match (rept ("z", 255), $ A: $ A)) -OU- List = offset ($ A $ 1, ,, match (valeur (rept ("9", 255)), $ A: $ A))

Charles Hunt
la source
0

= SOMME (SI (FRÉQUENCE (SI (SOUS-TOTAL DE 3, DÉCALAGE (A2: A100, ROW (A2: A100) - ROW (A2: A100) - ROW (A2)) -FREW (A2: 0,1)) -FREW (A2), 0,1) -FREW (A2), 0,1)), MATCH ("~" et A2: A100, A2: A100 & " ", 0)), emprise (A2: A100) -ROW (A2) +1), 1))

Assurez-vous d'appuyer sur Ctrl + Maj + Entrée après avoir collé cette formule. Ceci concerne une plage de A2: A100, ajustez la plage en conséquence.

Vlada
la source