Macro pour trier un classement

Fermé
Tom_Criz Messages postés 151 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 11 juin 2016 - Modifié par Tom_Criz le 11/06/2016 à 23:07
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 - 12 juin 2016 à 06:32
Bonjour à tous,


Pour un tournoi entre amis, nous organisons un championnat, j'aimerais automatiser le classement.

Il m'a été aisé (mais un peu fastidieux) d'automatiser la somme des pts, des matchs joués, buts marqués, etc... dans le classement. Puis j'arrive sans problème à trier manuellement via l'option tri personnalisé. Mais j'aimerais automatiser le tri via une macro (ou autre moyen, peu importe), mais là, je cale !

Je cherche à trier en fonction des colonnes suivantes, dans cet ordre, et en décroissant à chaque fois :
1. Pts
2. Diff
3. Bp
4. G

J'ai nommé "ClassementA" ma plage de données à trier, puis "PtsA" la colonne des Pts, "DiffA" celle de la Diff, etc.

J'ai trouvé la formule suivante :

Private Sub Worksheet_Change(ByVal adrcel As Range)
Range("ClassementA").Sort Key1:=Range("PtsA"), Order1:=xlDescending, _
Key2:=Range("DiffA"), Order2:=xlDescending, _
Key3:=Range("BpA"), Order3:=xlDescending, _
Key4:=Range("GA"), Order4:=xlDescending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
End Sub



Alors je n'ai peut-être pas bien compris comment affecter une macro à ma plage de données. Mais lorsque j'utilise VBA via l'outil développeur, et que je mets cette formule sur Feuil1, puis que je modifie un résultat dans la Poule A, j'ai eu un message d'erreur ("Erreur de compilation. L'argument nommé est introuvable"), et rien n'a bougé dans mon classement. Sur VBA, la première ligne du code est en surbrillance jaune.



Par ailleurs (j'ai pas mal d'ambition dans ma fainéantise...), j'aimerais inclure une partie de code qui fasse que si, à l'issue du tri, deux joueurs sont à égalité parfaite, ils soient départagés en fonction de leur résultat direct, puis de leurs résultats contre la meilleure équipe au classement (à l'exception d'eux évidemment), puis de l'équipe suivante, etc.

Exemple, égalité parfaite entre Joueur 2 et Joueur 3, 3e ex aequo du classement.
1. Déterminer selon leur confrontation directe (le vainqueur sera mieux classé). Disons qu'ils ont fait 2-2
2. Déterminer selon leurs résultats contre le 1er du classement (imaginons qu'ils aient tous les deux perdus contre le 1er)
3. Déterminer """ contre le 2e du classement (Joueur 2 a fait match nul, Joueur 3 a perdu => Joueur 2 sera classé devant Joueur 3)

J'imagine que pour le 1 j'ai besoin de déterminer dans la plage de cellule "PouleA", la ligne qui contient à la fois "Joueur 2" et "Joueur 3", puis déterminer avec une fonction "si" s'il y a eu un vainqueur pour le classer au-dessus, et s'il y a eu égalité déterminer leur résultat contre le 1er de poule, etc...


Ca me paraît à moi-même un peu lourd mais ça pourrait nous faire gagner un peu de temps sur notre journée de Tournoi d'avoir tout qui se met à jour en auto, qu'on n'ait qu'à entrer les résultats. Et je me dis que pour des habitués de la macro ça peut être assez simple, ou au pire comme un énoncé d'exercice sympa ^^


Merci beaucoup pour votre aide, je vous laisse le lien du fichier !
https://www.cjoint.com/c/FFltimqzsXS

Les résultats entrés dans la Poule A ne sont que des tests, ils peuvent être modifiés
A voir également:

1 réponse

Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 338
12 juin 2016 à 06:32
Bonjour
Pour le 1er point, vous demandez un tri sur 4 critères alors que la fonction utilisée n'en supporte que 3. Vous utilisez probablement une version d'Excel antérieure à 2007. Dans ce cas il faut faire le tri en 2 fois en commençant par les critères les moins prioritaires. D'abord un 1er tri avec "Ga" puis un 2ème tri avec "PtsA", DiffA" et "BpA".
Si vous utilisez une version d'excel >=2007 utilisez l'enregistreur de macro. ce qui donne
Private Sub Worksheet_Change(ByVal adrcel As Range)
    Range("ClassementA").Select
    ActiveWorkbook.Worksheets("Poules").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Poules").Sort.SortFields.Add Key:=Range("PtsA"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Poules").Sort.SortFields.Add Key:=Range("DiffA"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Poules").Sort.SortFields.Add Key:=Range("BpA"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Poules").Sort.SortFields.Add Key:=Range("GA"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Poules").Sort
        .SetRange Range("ClassementA")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Pour le 2ème point, il serait souhaitable que vous mettiez quelques exemples avec le résultat attendu, ce serait plus facile pour la compréhension.
Cdlt
0