Classement sans ex aequo

Fortunato

XLDnaute Nouveau
Bonjour,

Besoin de votre aide pour établir un classement selon 2 critères :
Le nombre de ventes par rapport au client contactés:
Principe => Le 1er doit être celui qui a fait le plus de ventes avec le maximum de contact.
Mon problème est que je n'y arrive pas avec la fonction rang

ci dessous un exemple

Noms Nbre Ventes Client Contactés RESULTAT ATTENDU
A 1 3 1er = F
B 1 2 2eme = C
C 6 7 3eme =G
D 1 4 4eme = H
E 2 2 5eme =E
F 6 6 6eme =I
G 3 5 7eme = B
H 3 8 8eme = A
I 2 3 9eme = D

En vous remerciant d'avance.
 

Pièces jointes

  • EXCEL RANG.xlsx
    9.3 KB · Affichages: 64

CISCO

XLDnaute Barbatruc
Bonjour

Plusieurs possibilités en pièce jointe, avec une formule matricielle dans la colonne D, donc à valider avec Ctrl+maj+entrer.

Les colonnes fonctionnent par couple, une intermédiaire, et une autre donnant le résultat final. Chaque couple est repérable grâce à sa couleur.

Le /100 pondère les résultats de la colonne C par rapport à ceux de la colonne B. Dans la pratique, il faut choisir un coefficient assez grand pour ne pas donner trop de poids à la colonne C. Donc, si le nombre d'appels habituels tournent vers 100, il faut mettre / 1000 par exemple.

J'ai mis dans certaines colonnes un LIGNE()/1000 juste pour différencier les possibles ex-æquo. A toi de tester avec et sans. Si tu changes le /100 précédent, il faudra aussi changer ce /1000 pour qu'il ne fausse pas les calculs.

@ plus
 

Pièces jointes

  • EXCEL RANG.xlsx
    10.9 KB · Affichages: 55

job75

XLDnaute Barbatruc
Bonsoir à tous,

Curieux Fortunato, vous parlez d'un maximum de contacts et vous prenez le minimum :rolleyes:

En VBA c'est simple, il suffit de trier :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
With [A1].CurrentRegion
  If FilterMode Then ShowAllData 'si la feuille est filtrée
  If .SpecialCells(xlCellTypeVisible).Count < .Count Then _
    .AutoFilter: .AutoFilter 'si tableau Excel filtré
    Range("E2:F" & Rows.Count) = "" 'RAZ
  If .Rows.Count = 1 Then GoTo 1 'si le tableau est vide
  .Sort .Columns(2), xlDescending, .Columns(3), , xlAscending, Header:=xlYes '1er tri
  [E2] = 1: [E2].Resize(.Rows.Count - 1).DataSeries
  [F2].Resize(.Rows.Count) = .Columns(1).Offset(1).Value
  .Sort .Columns(1), xlAscending, Header:=xlYes '2ème tri
End With
[E:E].NumberFormat = "0""EME"""
[E2].NumberFormat = "0""ER"""
1 Application.EnableEvents = True
End Sub
Edit : ajouté le code en cas de filtrage.

Fichier .xlsm joint.

A+
 

Pièces jointes

  • EXCEL RANG(1).xlsm
    24.1 KB · Affichages: 34
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Besoin de votre aide pour établir un classement selon 2 critères :
Le nombre de ventes par rapport au client contactés:
Principe => Le 1er doit être celui qui a fait le plus de ventes avec le maximum de contact.
Autres propositions sans matricielle, ni vba
upload_2017-10-6_22-3-57.png
 

Pièces jointes

  • Fortunato- EXCEL RANG- v1.xlsx
    34 KB · Affichages: 60

CISCO

XLDnaute Barbatruc
Bonsoir

Effectivement,la logique serait de différencier les ex-æquo avec le rapport - ou + vente/nbre de clients appelés, ou avec - ou +(vente/nbre de clients appelés* 100), mais comme ce n'est pas écrit dans la demande... au lieu de -nbre de clients appelés/100.

Tout à fait faisable avec des formules, matricielles ou pas (avec une colonne intermédiaire dans ce dernier cas, et/ou un tri).

A toi de choisir entre toutes ces possibilités.

@ plus
 

Pièces jointes

  • EXCEL RANGter.xlsx
    15.4 KB · Affichages: 44
Dernière édition:

job75

XLDnaute Barbatruc
Re,

Le 2ème tableau est tout à fait inutile :
Code:
Private Sub CommandButton1_Click()
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A1].CurrentRegion
  If CommandButton1.Caption = "RAZ" Then
    CommandButton1.Caption = "Classer"
    .Columns(5).EntireColumn = ""
    .Sort .Cells(1), xlAscending, Header:=xlYes 'tri alphabétique
  Else
    CommandButton1.Caption = "RAZ"
    If .Rows.Count = 1 Then Exit Sub 'si le tableau est vide
    .Sort .Columns(2), xlDescending, .Columns(3), , xlAscending, Header:=xlYes 'tri numérique
    .Cells(2, 5) = 1: .Cells(2, 5).Resize(.Rows.Count - 1).DataSeries
    .Columns(5).EntireColumn.NumberFormat = "0""EME"""
    .Cells(2, 5).NumberFormat = "0""ER"""
  End If
End With
End Sub
Edit : j'ai mis le tableau sous forme de tableau Excel.

Fichier (2).

A+
 

Pièces jointes

  • EXCEL RANG(2).xlsm
    30.8 KB · Affichages: 40
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour le fil, le forum,

Comme l'a fait remarquer Modeste geedee on peut se passer de formule matricielle et de VBA.

Voyez le tableau Excel du fichier joint avec ces formules en colonnes D E F :
Code:
=[@[Nbre ventes]]-[@[Clients contactés]]/1000-LIGNE()/10000
=RECHERCHEV(GRANDE.VALEUR([Aux1];LIGNE()-1);[Aux1];1;0)
=EQUIV([@Aux1];[Aux2];0)
Edit : RECHERCHEV en colonne E est plus simple que INDEX/EQUIV.

Bon dimanche.
 

Pièces jointes

  • EXCEL RANG par formules(1).xlsx
    18.3 KB · Affichages: 47
Dernière édition:

zebanx

XLDnaute Accro
Bonjour Job75

C'est une excellente idée d'utiliser GRANDE.VALEUR() dans le cas présent.:)

L'objectif de départ était d'obtenir une liste directe de 1 à 8 avec le nombre affiché et je me demande dans ce cas si l'utilisation d'une colonne supplémentaire (E) ne pourrait pas être ignorée par un DECALER (cf.exemple).
Et toujours redoutable d'utiliser le critère de ligne() en colonne D pour ne pas avoir de doublons au cas où les données des colonnes B et C sont identiques !

Bonne journée à toi (et à tous).
zebanx
 

Pièces jointes

  • code_job75.xls
    29.5 KB · Affichages: 53

job75

XLDnaute Barbatruc
Bonjour zebanx,

La formule de base avec GRANDE.VALEUR c'est CISCO qui l'a créée le premier au post #3.

Et la solution que vous proposez au post #11 n'a rien à voir avec celle de mon post #10.

Ma solution permet de toujours déterminer le rang, quel que soit le tri effectué sur le tableau.

Edit : il serait temps de vous doter d'une version Excel plus récente.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,

Si l'on veut pouvoir insérer/supprimer des lignes au-dessus du tableau la 2ème formule s'écrit :
Code:
=RECHERCHEV(GRANDE.VALEUR([Aux1];LIGNES(Tableau1[#En-têtes]:Tableau1[@])-1);[Aux1];1;0)
Fichier (2).

A+
 

Pièces jointes

  • EXCEL RANG par formules(2).xlsx
    18.6 KB · Affichages: 47

zebanx

XLDnaute Accro
@job75
Merci pour les formules et... la proposition de changement.
(Ca me gêne assez rarement cependant (surtout pour les "xxx.ENS(xxx)") mais 14 ans avec office 2003, c'est effectivement long -).
A+

@CISCO
Rendons à César ce qui lui appartient, merci pour GRANDE.VALEUR qui était idéal dans ce cas.
 

Discussions similaires

Réponses
22
Affichages
868

Statistiques des forums

Discussions
312 394
Messages
2 088 022
Membres
103 702
dernier inscrit
Greedyyy3317