Macro pour faire un classement

Bonjour

je souhaiterais pouvoir faire une macro qui me fait le classement du plus grand au plus petit poids toute catégorie en attribuant en colonne j des point : 1 pour le premier ,2 pour le second ,,,etc.

en cas d'égalité de poids celui qui a le plus petit nombre de poisson est le premier des exæquo et si le poids et le nombres sont exæquo c le plus gros poissons qui départage et si encore exæquo mettre le même nombres de point en colonne J

puis marquer en colonne M8 à M21 les premier de chaque catégorie

merci d'avance

41classement.xlsx (17.57 Ko)

Quelqu’un peut m aider s’il vous plaît ?

Bonjour,

Tant qu'à joindre un fichier, pourquoi laisser vides les colonnes qui interviendront dans le tri ?

Pour nous aider à comprendre, quelques exemples de résultats attendus seraient les bienvenus !

Et une solution sans macro n'est pas envisageable ? Si tu fais un tri sur plusieurs niveaux (tri décroissant sur le POIDS TOTAL, puis croissant sur le nombre de poissons, puis le plus gros poisson, etc.) tu n'obtiens pas le résultat souhaité ?

Salut,

Jai réussi a faire la macro pour mon classement toutes catégories mais comment pourrai je affiché Les premiers de chaque Catégories : en colonne M les noms et colonne N les Prénoms

Soit par macro , soit avec une formule

Merci

24classement.xlsm (28.94 Ko)

Bonjour,

En complétant ta proc. classement (j'ai simplifié le tri par la même occasion )

Sub classement()
    Dim d As Object, k, i%
    With Worksheets("Classement")
        .Sort.SortFields.Clear
        .Sort.SortFields.Add .Range("G2:G151"), xlSortOnValues, xlDescending
        .Sort.SortFields.Add .Range("H2:H151"), xlSortOnValues, xlDescending
        .Sort.SortFields.Add .Range("I2:I151"), xlSortOnValues, xlDescending
        .Sort.SetRange .Range("A1:I151")
        With .Sort
            .Header = xlYes
            .Apply
        End With
        Set d = CreateObject("Scripting.Dictionary")
        For i = 2 To 151
            k = .Cells(i, 6)
            If Not d.exists(k) Then d(k) = Array(.Cells(i, 2), .Cells(i, 3))
        Next i
        With .Range("M8:N21")
            For i = 1 To .Rows.Count
                k = Trim(Right(.Cells(i, 0), 2))
                If d.exists(k) Then .Rows(i).Value = d(k)
            Next i
        End With
    End With
End Sub

Note que ton tri est en contradiction avec ton post initial sur le nombre de poissons. Si c'est dans le tri que tu t'es trompé, tu pourras le rectifier, mais dans le cas d'un tri ascendant sur la colonne, les cellules vides en nombre de poissons iront à la fin quand même, pour les faire passer devant, il faut la valeur 0)...

Je suppose aussi qu'ayant fait ton tri, tu as abandonné les points...

Cordialement.

Bonjour,

Jai réussi a faire la macro pour mon classement toutes catégories

Sans doute pas avec le code qui figure dans ton Module1

Pour ton tri, dans ton premier message, tu disais "en cas d'égalité de poids celui qui a le plus petit nombre de poisson est le premier des exæquo" ... mais tes trois niveaux de tri sont chaque fois du plus grand au plus petit !?

Pour le premier de chaque catégorie, n'inscris, en colonne L que les lettres (attention aux espaces superflus comme en L8) et utilise éventuellement un format personnalisé "Premier "@

En M8, essaie:

=INDEX(B$2:B$151;EQUIV($L8;$F$2:$F$151;0))

à copier à droite et vers le bas

Si tu as toujours besoin des points, en colonne J (et pour autant que j'aie compris !?) teste, en J2:

=SI((G2=G1)*(H2=H1)*(I2=I1);J1;SI(J1="points";1;J1+1))

à copier en bas

[Edit:] Salut MFerrand ... je terminais de rédiger, alors je poste quand même !

Salut U.Milité !

Les espaces en trop c'est endémique en ce moment... j'ai pris le temps de vérifier qu'il n'y en avait pas à la fin des libellés du petit tableau...

Bon dimanche.

MERCI

La macro est fonctionnelle ce que je voulais vous m'avez bien compris !!! en expliquant mal lol

peut être un point a changer sur les classement des "premiers" que si le premier de la catégorie a 0 en poids total il ne faut pas l'afficher

Ajouts :

        For i = 2 To 151
            If .Cells(i, 7) = 0 Then Exit For
            k = .Cells(i, 6)

On cesse de recueillir les données lorsqu'on atteint la valeur 0.

        Application.ScreenUpdating = False
        With .Range("M8:N21")
            .ClearContents

Et pour un petit confort supplémentaire : on efface le tableau avant de le resservir, et comme cela fait une opération visible en plus, on interrompt la mise à jour de l'affichage...

Le cas échéant, on peut placer la ligne d'inhibition du rafraîchissement de l'écran avant l'application du tri.

Cordialement.

MERCI

ENCORE UNE FOIS !!!!

Rechercher des sujets similaires à "macro classement"