Classement selon condition

Bonjour,

J'ai un fichier avec un classement suite à plusieurs courses. Il se peut que plusieurs coureurs aient le même nombre de point. Ces coureurs doivent être classés suivant le nombre de 1ère place, puis 2ème place, puis 3ème place....

Dans mon fichier exemple, on devrait avoir dans l'ordre le n° 1220, 1247 puis 1201.

Je n'ai aucune idée de la manière d'automatiser cela
Merci à tous ceux qui m'aideront

13fichierdetest.xlsx (72.05 Ko)

Bonjour,

Ci-joint un essai. Mais je ne comprends pas votre calcul, pour moi le 1223 a bien plus de "1" que les numéros que vous mentionnez...

Mon classement ("score" calculé selon : nb_1*100000+nb_2*1000+nb_3*10) :

ClassementScore
13010001223
22000201222
31000101220
7fichierdetest.xlsx (72.76 Ko)

bonjour,
Merci de votre réponse.
Le 1223 ne rentre pas en ligne de compte car il est classé 8 et il n'y a pas d'aequo. Les seuls concernés dans cet exemple sont les 1201, 1220 et 1247 qui ont 423 points
En fait, pour les aequo, il faut vérifier pour toutes les places qui a fait le plus de meilleurs place
Cordialement

Ah ok, je vois. il aurait été utile de préciser que la demande portait sur les ex-aequo sur votre score initial.

Via formules (XL2019) et avec la structure de votre tableau ça m'a l'air d'être bien compliqué. Accepteriez-vous une solution VBA ?

Mon message précisait "même nombre de points" mais peut être ce n'était pas assez clair.

Oui j'accepte une solution VBA

Ah oui en effet, je suis étourdi.

Alors ci-joint une proposition contenant une petite fonction VBA permettant de départager vos scores. L'idée est toujours de sommer les résultats des scores, et on ajoute en partie décimale le classement que vous demandiez. L'astuce c'est ensuite de jouer sur le format de cellule pour masquer les chiffres après la virgule. Ainsi, même si pour nous les scores paraissent identiques, pour la formule RANK ils sont un peu différents.

Ci-joint le fichier et ci-après la formule utilisée (en colonne C) :

Public Function ClassementMalin(dataRng As Range) As Double
  Dim data: data = dataRng.Value
  Dim i As Long, total As Double
  For i = LBound(data, 2) To UBound(data, 2)
    If i Mod 2 = 0 Then
      total = total + data(1, i)
    Else
      Select Case data(1, i)
      Case 1
        total = total + 0.01
      Case 2
        total = total + 0.0001
      Case 3
        total = total + 0.000001
      End Select
    End If
  Next i

  ClassementMalin = total
End Function
13fichierdetest.xlsm (79.85 Ko)

Merci de la solution proposée.
Du coup, je dois modifier le case pour avoir autant de case que de coureurs dans ma liste car cela peut bien être les 62ème et 63ème coureurs qui ont le même nombre de points

Si la liste s'allonge, il suffit de tirer les formules vers le bas.

non je me parle pas de tirer la fonction vers le bas. La fonction vérifie "uniquement" les places 1, 2 et 3 mais on doit vérifier sur l'ensemble des places car on peut avoir les coureurs 61 et 62 ex-aequo mais pas sur les premières places

Ah oui ça complique les choses... Combien vous avez de coureurs/places au maximum ? 100 / 1000 /... ? Ya-t-il toujours 7 courses (de Uchizy à Mesvres) ou bien c'est aussi variable ?

Car ça va conditionner la solution.

On peut aller jusqu'à 150 coureurs et 7 courses

un essai

5fichierdetest.xlsm (90.54 Ko)

Super la solution. Je teste asap
Merci beaucoup

Cordialement
Sylvie

Bonjour à tous,

Si jamais vous trouverez ci-joint la solution sur laquelle je bossais hier, assez différente de celle de Bart. Elle devrait s'adapter à de nombreux cas (j'espère). N'hésitez pas à les tester et nous faire des retours !

5fichierdetest.xlsm (94.03 Ko)

Bonne journée

Salut Bart

@Bart,
Je ne comprends pas la colonne Ranking. Elle est censée contenir le classement de la personne?
Merci de ton aide

re, non. La colonne B fait un ranking de la colonne A du plus grand au plus petit, donc pour les ex-aequo's, on aura aussi besoin d'une valeur qui est trié du plus grand au plus petit... .

La colonne AB montre dans chaque cellule les classements du coureur en séquence ascendante. On veut favoriser les premières places, donc la colonne AC compte les "textes" de la colonne AB qui sont "plus petit" que le texte dans sa cellule en colonne AB, cad. si on met la colonne AB alphabetiquement, le nombre de cellules qui sont avant notre cellule. Comme ça, le "1223" est le plus grand pour ce critère, parce qu'il a 3 premières places et puis une 2ième place, donc on a 205 cellules en AB qui sont plus petites.

En colonne A, on ajoute cette valeur divisée par 10.000 à la somme. Comme ça, on crée des valeurs uniques, même pour les ex-aequo's.

Rebonjour à tous,

Juste pour partager, une autre solution utilisant une autre méthode de tri (similaire @BsAlv) mais surtout en utilisant l'excellente bibliothèque stdVBA: VBA Standard Library que je suis en train de découvrir (j'ai utilisé ce problème comme test).

@BsAlv le calcul de la clé="rang" d'un coureur est fait dans Biker > IndexOf.

12fichierdetest.zip (349.35 Ko)

oei Saboh12617,

on ordinateur ne veut pas ouvrir ton fichier à cause d'une "détection d'un virus" !!!!

PS. je ne crois pas que std est un outil fiable pour utiliser ici, on verra ...

merci à tous les deux pour votre aide. J'ai trouvé mon bonheur et cela fonctionne tip top

Merci pour votre retour Sylvie, bon weekend.

@BsAlv étrange... J'ai regardé le code rien de suspect dans ce que j'ai utilisé. Peut-être quelques appels à l'api windows.

Rechercher des sujets similaires à "classement condition"