Microsoft 365 Top 3 sans TCD

nat54

XLDnaute Barbatruc
Bonjour,

Comment réaliser un top 3 par service (j'ai mis 2 exemples) sans TCD ?

Merci,
 

Pièces jointes

  • Classeur2.xlsx
    9.6 KB · Affichages: 16
Solution
Re
Ca devient confus...
Ton exemple en $B$27:$C$29 ne me semble pas bon.
Pourquoi ne pas utiliser des tableaux structurés pour tes données ?
J'ai adapté ma proposition pour ton dernier fichier.
Je pense avoir été au bout.

Cordialement

job75

XLDnaute Barbatruc
Bonsoir nat54, chris,
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [J1]) Is Nothing Then Exit Sub
Dim P As Range
Application.ScreenUpdating = False
With [A1].CurrentRegion
    .AutoFilter 1, [J1] 'filtre automatique
    Set P = .Offset(1).SpecialCells(xlCellTypeVisible)
    .AutoFilter
    Set P = Intersect(P, .Columns(2).Resize(, 2))
End With
With [J3].Resize(Rows.Count - 2, 2)
    .Clear 'RAZ
    If P Is Nothing Then Exit Sub
    P.Copy .Cells(1) 'copier-coller
    .RemoveDuplicates Array(1, 2), Header:=xlNo 'supprime les lignes doublons
    .Sort .Cells(1, 2), xlDescending, .Cells(1), , xlAscending, Header:=xlNo 'tri sur 2 colonnes
End With
[J6].Resize(Rows.Count - 5, 2).Clear 'garde les 3 premiers
End Sub
Comme il peut y avoir des lignes en doublon il faut les supprimer.

A+
 

Pièces jointes

  • Classeur2.xlsm
    17.9 KB · Affichages: 5

Efgé

XLDnaute Barbatruc
Bonjour à toutes et tous,
Je n'ai pas compris la même chose, donc je propose...
Je n'ai pas trouvé comment limiter le résultat aux trois premières lignes mais je trie les valeurs par opération en additionnant les montant correspondants.
VB:
=LET(
toto1;UNIQUE(FILTRE(Tableau1[Opération];Tableau1[Service]=J1));
toto2;SOMME.SI.ENS(Tableau1[Montant];Tableau1[Service];J1;Tableau1[Opération];toto1);
TRIER(ASSEMB.H(toto1;toto2);2;-1)
)
Si quelqu'un trouve comment ne renvoyer que les trois premières lignes, je suis intéressé.

Cordialement
 

Pièces jointes

  • Classeur2 (9).xlsx
    13 KB · Affichages: 3

Efgé

XLDnaute Barbatruc
Re
En fait la solution pour extraire les trois premières lignes était déjà donnée par @chris
VB:
=LET(
toto1;UNIQUE(FILTRE(Data[Opération];Data[Service]=J1));
toto2;SOMME.SI.ENS(Data[Montant];Data[Service];J1;Data[Opération];toto1);
PRENDRE(TRIER(ASSEMB.H(toto1;toto2);2;-1);3;2)
)
Cordialement
 

Pièces jointes

  • Classeur2 (9).xlsx
    12.9 KB · Affichages: 3

nat54

XLDnaute Barbatruc
Re,

Génial cette proposition ! Même si je ne comprends rien à la formule ...

Mon collègue vient par contre de m'annoncer une complexité dont je n'avais pas connaissance lors de la création du sujet sur le forum.
On doit exclure une des opérations, admettons la A4 : est-ce possible ?
 

chris

XLDnaute Barbatruc
Bonjour à tous

Je ne vois aucune valeur à 27 ni 20 pour le service AAA dans le tableau fourni...

Si on mets sous forme d etableau
VB:
=PRENDRE(TRIER(FILTRE(Data[[Opération]:[Montant]];Data[Service]=J1);2;-1;0);3)

A placer en I4

Pour exclure A4
Code:
=PRENDRE(TRIER(FILTRE(Data[[Opération]:[Montant]];(Data[Service]=J1)*(Data[Opération]<>"A4"));2;-1;0);3)
 

Efgé

XLDnaute Barbatruc
Re
Ma vision sans "A4"
VB:
=LET(
toto1;UNIQUE(FILTRE(Data[Opération];(Data[Service]=J1)*(Data[Opération]<>"A4")));
toto2;SOMME.SI.ENS(Data[Montant];Data[Service];J1;Data[Opération];toto1);
PRENDRE(TRIER(ASSEMB.H(toto1;toto2);2;-1);3;2)
)
Cordialement
 

nat54

XLDnaute Barbatruc
Re,

Voilà le tableau revu.
Je vois déjà un hic si 2 montants identiques mais on verra ça après ^^

Idée supplémentaire
• exclure l'opération en question du TCD
• peut-être que trier de façon décroissante les montants aiderait ?! pour ne conserver que les 3 premières valeurs du service
 

Pièces jointes

  • Top_3_sans_TCD.xlsx
    10.2 KB · Affichages: 5
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 104
dernier inscrit
JEMADA