Afficher un top n des valeurs les plus ou moins fréquentes

Zedairone

XLDnaute Nouveau
Bien le bonjour,

Je recherche un moyen simple d'afficher un top 5, 10, etc. des valeurs les plus, ou moins fréquentes issues d'une plage de cellules. Je m'explique : De A1 à E500 (exemple), j'ai 2500 valeurs allant de x à y. Dans 5 cellules (G1:K1) je souhaite qu'apparaissent dans l'ordre les 5 valeurs les plus ou moins fréquentes. (La plus fréquente dans G1, la seconde plus fréquente dans H1, etc. et inversement) Je n'ai pas besoin du nombre d’occurrences. (avec NB.SI)

Voilà voilà, merci par avance pour votre aide.
Cordialement,
Léo.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Afficher un top n des valeurs les plus ou moins fréquentes

Bonsoir Zedairone et bienvenue sur XLD :) ,
Bonsoir R@chid :),

Comme c'est votre première intervention, j'ai construit un fichier en attendant le votre :).

L'essai est basé sur une fonction personnalisée (en VBA) qui s'écrit:=FreqRang(Plage, nOrdre) où:

  • Plage est la plage des valeurs
  • nOrdre est le rang de l'élément désiré

ex n°1: =FreqRang($A$1:$E$500;4) : parmi les valeurs apparaissant le plus au sein de la plage $A$1:$E$500, on veut la quatrième valeur.

ex n°2: =FreqRang($A$1:$E$500;-2) : parmi les valeurs apparaissant le moins au sein de la plage $A$1:$E$500, on veut la deuxième valeur. Notez le signe moins pour indiquer qu'on veut travailler avec les valeurs apparaissant le moins.

Pour indiquer le rang dans le fichier, on a utilisé le terme COLONNES($H4:H4) qui renvoie le nombre de colonne de la zone $H4:H4 (donc ici on renvoie 1). Lorsque cette expression est recopiée vers la droite, elle va renvoyer 2, puis 3, puis 4, etc.

Bien sûr, si on ne veut que les 5 première ou dernières valeurs, on efface les cellules contenant la formule après 5 cellules résultats.


Une particularité qui a son importance:
Le code de la fonction personnalisée utilise des objets de type Dictionary. Il faut activer la référence à la bibliothèque qui met à disposition ce type d'objet. Pour activer cette référence, suivez les instruction ci-dessous:

Le fonctionnement nécessite l'activation de la référence à "Microsoft Scripting Runtime". Pour cela:
.

  • Se placer dans l'éditeur VBA (touches Alt+F11)
  • Sélectionner le menu "Outils / Références..."
  • Dans la boîte de dialogue, chercher "Microsoft Scripting RunTime"
  • Cocher la case correspondante (si ce n'est pas déjà le cas) puis cliquer sur "OK"

Rem 1: l’onglet "Nombre" contient un exemple avec une plage ne comportant que des nombres.
Rem 2: l’onglet "Texte & nombre" contient un exemple avec une plage mélangeant textes et nombres.
Rem 3: Juste pour la vérif., j'ai rajouté les fréquences d'apparition dans le tableau en gris (NB.SI(...). Ce tableau peut être effacé bien sûr!

Attention!
La fonction n'est pas du tout optimisée. Elle convient pour des "petites" quantités de données sources.
 

Pièces jointes

  • Zedairone-Maxis et Minis d une plage v1.xlsm
    52.6 KB · Affichages: 148
Dernière édition:

Zedairone

XLDnaute Nouveau
Re : Afficher un top n des valeurs les plus ou moins fréquentes

Bonsoir, merci à vous pour vos réponses, j'ai mis comme convenu en pièces jointes un fichier exemple tout simple, cinq colonnes (que j'ai copié sur la première), avec à côté les valeurs les plus fréquentes, et les moins fréquentes, sous forme d'un top 5. (il ne manque plus que les formules, car je dois avouer je ne comprends pas trop ton fichier Mapomme. (Il s'agit bien de valeurs numériques) Je préfère comprendre la formule et son utilisation dans un exemple simple et ensuite je suis plus à l'aise pour adapter son utilisation dans un tableur plus complexe. (quand j'essaye de rentrer la formule j'ai l'erreur #NOM?)

Merci à vous.
Bonne soirée,
Léo.
 

Pièces jointes

  • Zedairone_exemple1.xlsx
    9.2 KB · Affichages: 67
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Afficher un top n des valeurs les plus ou moins fréquentes

Bonsoir Zedairone,

Comme tu ne sembles pas à l'aise avec le VBA et les fonctions personnalisées, je te propose une solution par formules.
Cette solution utilise une colonne intermédiaire F (qu'on peut masquer si on le désire).

Il y a 5 formules différentes:

En F1: la formule calcule le nombre d’élément distincts du tableau en A1:E50. Cette formule est une formule matricielle à valider par Ctrl+Maj+Entrée.
Code:
=SOMME(1/NB.SI(A1:E50;A1:E50))

En F2: la formule affiche l'élément du tableau qui a la plus grande fréquence. C'est une formule ordinaire qui se valide par Entrée.
Code:
=SIERREUR(MODE($A$1:$E$50);"")

En F3: la formule affiche l'élément suivant de plus grande fréquence. Cette formule est une formule matricielle à valider par Ctrl+Maj+Entrée.
Code:
=SI(LIGNES(F$2:F3)>$F$1;"";SIERREUR(MODE(SI(ESTNUM(EQUIV($A$1:$E$50;F$2:F2;0));"";$A$1:$E$50));""))
Cette formule est à tirer vers le bas pour obtenir les éléments suivants du tableau selon leur fréquence en ordre décroissant.
On copie cette formule vers le bas jusqu'à obtenir une cellule vide. Ne pas aller au delà car cela peut augmenter le temps de calcul de manière très importante.



En I3: la formule recherche le premier élément de la colonne F à partir de la deuxième ligne. C'est une formule ordinaire qui se valide par Entrée. Cette formule est à copier vers la droite pour obtenir les éléments suivants.
Code:
=INDEX($F:$F;1+COLONNES($I3:I3))

En I8: la formule recherche le dernier élément de la colonne F. C'est une formule ordinaire qui se valide par Entrée. Cette formule est à copier vers la droite pour obtenir les éléments suivants.
Code:
=INDEX(DECALER($F$2;0;0;NB($F$2:$F$39);1);NB($F$2:$F$39)-COLONNES($I8:I8)+1)

Nota: pour des gains en temps de calcul, la méthode employée ignore les éléments qui n'apparaissent qu'une seule fois dans le tableau.


Formule matricielle: Elle doit être validée par la combinaison des touches Ctrl+Maj+Entrée au lieu de la seule touche Entrée comme une formule classique.
Si la validation matricielle est correcte, alors Excel entoure la formule d'accolades {=.......}.
Chaque fois que cette formule sera modifiée, la validation devra se faire par Ctrl+Maj+Entrée. Les accolades apparaissent à la validation et ne doivent pas être saisies au clavier.

Errata: v1a corrigé les formules grisées qui étaient erronées et qui ne servent pas (sauf pour vérif). On commençait le comptage du NB.SI à la ligne 3 !?!!??!!! Les 5 formules principales n'ont pas changé.
 

Pièces jointes

  • Zedairone_exemple1 v1a.xlsx
    16.6 KB · Affichages: 86
Dernière édition:

Zedairone

XLDnaute Nouveau
Re : Afficher un top n des valeurs les plus ou moins fréquentes

J'y vois un peu plus clair en effet, cependant j'ai un problème avec la toute première formule en F1. Lorsque la plage de cellules concernées possèdes quelques cellules vides, j'obtiens une erreur de division par 0, car si je comprend bien les cellules vides sont considérées comme des cases ayant pour valeur 0 ... Y a-t-il un moyen d'ignorer ces cellules, dans le mesure où je serai forcé de les garder dans la plage ?

Exemple : Dans la plage A1:E50, la ligne de cellules 14 est vide, donc les cellules A14;B14;C14;D14;E14 sont vides.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Afficher un top n des valeurs les plus ou moins fréquentes

Bonsoir Zedairone,

Je n'avais pas envisagé le cas des cellules vides, c'est pas bien :eek:. Ci-joint un autre essai avec de nouvelles formules.

Il n' y a plus que 4 formules différentes. Pour plus de clarté, j'ai nommé la plage $A$1:$E$50 -> Plage.

En F1: la formule affiche l'élément du tableau qui a la plus grande fréquence. C'est une formule ordinaire qui se valide par Entrée.
Code:
=SIERREUR(MODE(Plage);"")

En F2: la formule affiche l'élément suivant de plus grande fréquence. Cette formule est une formule matricielle à valider par Ctrl+Maj+Entrée.
Code:
=SIERREUR(MODE(SI(Plage="";"";SI(ESTNUM(EQUIV(Plage;F$1:F1;0));"";Plage)));"")
Cette formule est à tirer vers le bas pour obtenir les éléments suivants du tableau selon leur fréquence en ordre décroissant.
On copie cette formule vers le bas jusqu'à obtenir une cellule vide. Ne pas aller au delà car cela peut augmenter le temps de calcul de manière très importante.

En I3: la formule recherche le premier élément de la colonne F à partir de la deuxième ligne. C'est une formule ordinaire qui se valide par Entrée. Cette formule est à copier vers la droite pour obtenir les éléments suivants.
Code:
=SI(COLONNES($I3:I3)>NB($F:$F);""; INDEX($F:$F;COLONNES($I3:I3)))

En I8: la formule recherche le dernier élément de la colonne F. C'est une formule ordinaire qui se valide par Entrée. Cette formule est à copier vers la droite pour obtenir les éléments suivants.
Code:
=SI(COLONNES($I3:I3)>NB($F:$F);""; SIERREUR(INDEX($F:$F;EQUIV(10^99;$F:$F;1)+1-COLONNES($I8:I8));""))

Nota 1: pour des gains en temps de calcul, la méthode employée ignore les éléments qui n'apparaissent qu'une seule fois dans le tableau.

Nota 2: laisser la colonne F vide (au moins de toute valeur numérique) après la dernière formule qu'on a tiré/copié depuis F2. Sinon l'expression EQUIV(10^99;$F:$F;1) risque ne ne plus renvoyer le numéro de ligne de la dernière valeur numérique qu'on désire de la colonne F.

Nota 3
: Normalement, les formules distinguent la valeur 0 qui est un chiffre d'une cellule vide.
 

Pièces jointes

  • Zedairone_exemple1 v2.xlsx
    16.6 KB · Affichages: 84
Dernière édition:

Zedairone

XLDnaute Nouveau
Re : Afficher un top n des valeurs les plus ou moins fréquentes

Bonsoir mapomme, merci à toi pour ce que tu fais pour un gars un peu pommé dans les formules complexes. :D Ce que tu as donné correspond bien à ce que je recherchais.

PS : Comment as-tu fait pour créer un "mot" qui renvoi vers une plage de données ? (dans cet exemple ce que tu as nommé tout simplement "Plage")
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Afficher un top n des valeurs les plus ou moins fréquentes

Re,
[...] Comment as-tu fait pour créer un "mot" qui renvoi vers une plage de données ? (dans cet exemple ce que tu as nommé tout simplement "Plage") [...]

Voir le fichier joint qui décrit une des méthodes pour attribuer un nom (maPlage dans l'exemple) à une plage de cellules.

Voir fichier ici
 
Dernière édition:

erolland

XLDnaute Nouveau
Bonjour à tous,

Cela fait plusieurs jours que je cherche à faire exactement la même chose que le sujet de ce forum, c'est-à-dire voir quelles valeurs dans une colonne sont les plus fréquentes, mais toutes les formules présentées ici ne marchent pas car si j'ai bien compris, mes colonnes mélangent texte ET chiffres... avez-vous des solutions ? J'ai un tableau de 24 colonnes * 3000 lignes que je ne peux partager ici car confidentiel, mais qui contient des données d'accident d'avion avec des colonnes sur le sujet de l'accident, la date, le lieu, système concerné, etc. et je cherche à voir quels sont les mots les plus récurrents dans la colonne "sujet". J'espère avoir été clair ! J'espère que quelqu'un pourra m'aider, en attendant je vous souhaite une bonne journée !
Erwan
 

erolland

XLDnaute Nouveau
Bonjour, merci pour la réponse ! Je joins une partie du fichier, mon but est donc de regarder dans la colonne "Sujet" les mots qui reviennent le plus souvent. Par exemple sur mon fichier joint cela afficherait le mot "indication" car c'est le mot le plus fréquent avec 2 occurrences, qui se trouvent dans la colonne "sujet" des lignes 4 et 6. Le but serait d'afficher le mot le plus fréquent, puis le 2è plus fréquent, ainsi de suite.
Bonne après-midi
 

Pièces jointes

  • Test fréquence mots.xlsx
    12.1 KB · Affichages: 18

CISCO

XLDnaute Barbatruc
Bonjour

Je ne vois pas Indication dans H6...

C'est tout à fait au-dessus de mes compétences en VBA, donc, je ne pourrai pas beaucoup t'aider... Ceci dit, il me semble avoir vu un fil sur un sujet similaire sur le forum, il y a un certain temps de ça... Je vais un peu chercher...

@ plus
 

CISCO

XLDnaute Barbatruc
Rebonjour

Trouvé... c'est encore un bijou de J. Boisgontier.

Regarde ce que cela donne avec les mots de ton fichier. Tu as deux possibilités :
* Faire un copier-coller vers la première colonne et remplacer tous les espaces entre les mots de ton texte par un |. Le résultat est donné grâce à une fonction personnalisée dans la troisième colonne.
* Adapter la macro pour qu'elle fasse le travail directement dans ton fichier.

@ plus
 

Pièces jointes

  • FonctionFrequenceMots.xls
    58 KB · Affichages: 40

erolland

XLDnaute Nouveau
Bonjour ! Et merci pour la réponse.

Pour la 1ère solution, ça va être difficile étant donné que j'ai 3000 lignes dans mon tableau avec souvent plusieurs mots par ligne donc je ne me vois pas mettre un " | " entre chaque mot. Je ne suis vraiment pas à l'aise avec les macros et je ne comprends pas vraiment le code, cependant n'y a-t-il pas moyen, dans la macro, de considérer un espace (" ") plutôt que le " | " comme séparateur entre les mots ? J'ai bien peur de ne pas savoir adapter la macro à mon cas...

Je recherche de mon côté, bonne soirée à vous !
 

Discussions similaires

Statistiques des forums

Discussions
314 499
Messages
2 110 247
Membres
110 711
dernier inscrit
chmessi