XL 2016 les 4 meilleurs/pires sans trier ?

F22Raptor

XLDnaute Impliqué
Bonjour à tous,
Ci-joint, un tableau avec en colonne des dates, et en ligne des items, et une valeur dans chaque cellule.
Il faut imaginer une centaine de dates/colonnes, et jusqu'à quelques dizaines d'items ...

Je souhaite obtenir pour chaque date la médiane des N meilleurs items, et des N pires items. Disons que N = 4 (mais ça pourrait être changé).
En manuel, il faut que je trie sur chaque date par ordre décroissant, je fais MEDIANE(B2:B5) pour les meilleurs, MEDIANE(B12:B15) pour les pires, je copie/colle les deux résultats, et je recommence en triant la date suivante.

Un peu fastidieux avec 100 dates !
Je pourrais faire un fonction en VBA, mais s'il y a une manière plus simple, en formule (matricielle ?), je suis preneur !

:)
 

Pièces jointes

  • medianes_auto.xlsm
    9.6 KB · Affichages: 5

chris

XLDnaute Barbatruc
Bonjour

Une solution PowerQuery (intégré à 2016) : je ne sais pas s'il fallait lister les items mais c'est possible.

Actualiser par Données, Actualiser Tout

Edit :
fichier modifié car déplacement à tort des données à droite de la source ce qui ne permet pas d'actualiser
 

Pièces jointes

  • Medianes_auto_PQ.xlsx
    20.5 KB · Affichages: 6

F22Raptor

XLDnaute Impliqué
Merci Tbft.
Dans ton tableau, où calcules-tu la médiane ?
Je vois que ça retourne les 3 pires et 3 meilleurs, mais pas directement leur médiane ?

Et au cas où ce serait trop complexe/lourd à faire directement en formule, j'ai écrit ce petit bout de fonction VBA


VB:
Function MaMediane(MaZone As Range, MonNbre As Integer, Ordre As Byte)
    ' MonNbre : N meilleurs ou N pires de la zone // Ordre : 0 pour ordre décroissant (médiane des meilleurs), sinon 1

    Dim i As Integer, j As Integer
    
    Dim ListeValeurs() As Double
    ReDim ListeValeurs(MonNbre - 1)
    
    j = 0
    
    For i = 1 To MaZone.Rows.Count
    
        If Application.Rank_Eq(MaZone.Cells(i, 1).Value, MaZone, Ordre) <= MonNbre Then ListeValeurs(j) = MaZone.Cells(i, 1).Value: j = j + 1
    
    Next i

    MaMediane = Application.Median(ListeValeurs)

End Function
 

Discussions similaires

Réponses
28
Affichages
1 K

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16