Macro pour trier un classement
Tom_Criz
Messages postés
151
Date d'inscription
Statut
Membre
Dernière intervention
-
Frenchie83 Messages postés 2240 Date d'inscription Statut Membre Dernière intervention -
Frenchie83 Messages postés 2240 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Macro pour trier un classement
- Trier un tableau excel - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Logiciel pour trier les photos automatiquement - Guide
- Jitbit macro recorder - Télécharger - Confidentialité
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
1 réponse
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
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
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