XL 2019 Classement par critere

LE BLEVEC

XLDnaute Junior
Bonjour
Faire un classement
en prenant que les 3 premier de chaque catégorie et rajouter 1-2-3, si que 1 dans la catégorie mettre 1 si que 2 mettre 1-2
et ça sur tout
je les ai déja trié par epreuve, categorie et point
mais apres je ne sais pas faire
j'ai mis un exemple a droite
je souhaiterais avec formules
je joint le fichier
merci de votre aide
 

Pièces jointes

  • export_complet_tir_competition_505_28122024.xlsx
    32 KB · Affichages: 18

job75

XLDnaute Barbatruc
Bonjour le forum,

Voyez le fichier .xlsm joint avec cette macro affectée au bouton :
VB:
Sub Classer()
Dim d As Object, lig&, i&, crit$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
Application.ScreenUpdating = False
[H:N].Clear 'RAZ
With [A1].CurrentRegion
    .Columns(6).NumberFormat = "0.0"
    .Columns(6).Replace ".", ".", xlPart 'convertit la colonne
    .Sort .Columns(3), xlAscending, .Columns(4), , xlAscending, .Columns(6), xlDescending, Header:=xlYes 'tri sur 3 colonnes
    .Columns(5).Insert xlToRight 'colonne auxiliaire
    .Columns(5) = "=RC[-2]&RC[-1]"
    .Columns(5) = .Columns(5).Value 'supprime les formules
    lig = 1
    For i = 2 To .Rows.Count
        crit = .Cells(i, 3) & .Cells(i, 4)
        If .Cells(i, 3) <> "" And Not d.exists(crit) Then
            d(crit) = ""
            .AutoFilter 5, crit 'filtre automatique
            .Copy .Cells(lig, 10) 'copier-coller
            .AutoFilter 'ôte le filtre
            .Cells(lig, 10).Resize(, 7).Clear 'supprime les titres
            .Cells(lig + 1, 10).CurrentRegion.Resize(, 7).Offset(3).Clear 'ne garde que 3 lignes
            .Cells(lig + 1, 9) = 1
            If .Cells(lig + 2, 10) <> "" Then .Cells(lig + 2, 9) = 2
            If .Cells(lig + 3, 10) <> "" Then .Cells(lig + 3, 9) = 3
            lig = lig + Application.Max(.Cells(lig + 1, 9).Resize(3)) + 1
        End If
    Next
    .Columns(14).Delete xlToLeft
    .Columns(5).Delete xlToLeft 'supprime la colonne auxiliaire
End With
End Sub
Je n'ai pas cherché à optimiser la rapidité car a priori le nombre de lignes n'est pas très grand.

A+
 

Pièces jointes

  • export_complet_tir_competition_505_28122024.xlsm
    36.3 KB · Affichages: 10

micheldu52

XLDnaute Occasionnel
Bonjour Michel
c'est tres sympas et réponse rapide
mais il manque catégorie
Camille
Oups, petite erreur...

Dans la colonne S, modifie (toutes) les formules
=RECHERCHEV($Q$3*100+$O5;$A:$J;9;FAUX)

par
=RECHERCHEV($Q$3*100+$O5;$A:$J;8;FAUX)

(le 9 est en réalité un 8, la 8 éme colonne par rapport à la A, c'est à dire la H qui est celle qui contient la catégorie alors que le 9 renvoyait à la 9éme colonne c'est à dire la I qui contient le club

Michel
 

LE BLEVEC

XLDnaute Junior
Bonjour le forum,

Voyez le fichier .xlsm joint avec cette macro affectée au bouton :
VB:
Sub Classer()
Dim d As Object, lig&, i&, crit$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
Application.ScreenUpdating = False
[H:N].Clear 'RAZ
With [A1].CurrentRegion
    .Columns(6).NumberFormat = "0.0"
    .Columns(6).Replace ".", ".", xlPart 'convertit la colonne
    .Sort .Columns(3), xlAscending, .Columns(4), , xlAscending, .Columns(6), xlDescending, Header:=xlYes 'tri sur 3 colonnes
    .Columns(5).Insert xlToRight 'colonne auxiliaire
    .Columns(5) = "=RC[-2]&RC[-1]"
    .Columns(5) = .Columns(5).Value 'supprime les formules
    lig = 1
    For i = 2 To .Rows.Count
        crit = .Cells(i, 3) & .Cells(i, 4)
        If .Cells(i, 3) <> "" And Not d.exists(crit) Then
            d(crit) = ""
            .AutoFilter 5, crit 'filtre automatique
            .Copy .Cells(lig, 10) 'copier-coller
            .AutoFilter 'ôte le filtre
            .Cells(lig, 10).Resize(, 7).Clear 'supprime les titres
            .Cells(lig + 1, 10).CurrentRegion.Resize(, 7).Offset(3).Clear 'ne garde que 3 lignes
            .Cells(lig + 1, 9) = 1
            If .Cells(lig + 2, 10) <> "" Then .Cells(lig + 2, 9) = 2
            If .Cells(lig + 3, 10) <> "" Then .Cells(lig + 3, 9) = 3
            lig = lig + Application.Max(.Cells(lig + 1, 9).Resize(3)) + 1
        End If
    Next
    .Columns(14).Delete xlToLeft
    .Columns(5).Delete xlToLeft 'supprime la colonne auxiliaire
End With
End Sub
Je n'ai pas cherché à optimiser la rapidité car a priori le nombre de lignes n'est pas très grand.

A+
bonsoir
merci pour le travail de fait impeccable
mais (c'est de ma faute) dans classer ,dans les epreuve categorie il faudrait qu'il n'y a pas de ligne vide
mea coulpa
merci encore
 

job75

XLDnaute Barbatruc
Bonjour le forum,
mais (c'est de ma faute) dans classer ,dans les epreuve categorie il faudrait qu'il n'y a pas de ligne vide
Alors utilisez cette macro :
VB:
Sub Classer()
Dim d As Object, lig&, i&, crit$, n&
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
Application.ScreenUpdating = False
[H:N].Clear 'RAZ
With [A1].CurrentRegion
    .Columns(6).NumberFormat = "0.0"
    .Columns(6).Replace ".", ".", xlPart 'convertit la colonne
    .Sort .Columns(3), xlAscending, .Columns(4), , xlAscending, .Columns(6), xlDescending, Header:=xlYes 'tri sur 3 colonnes
    .Columns(5).Insert xlToRight 'colonne auxiliaire
    .Columns(5) = "=RC[-2]&RC[-1]"
    .Columns(5) = .Columns(5).Value 'supprime les formules
    lig = 2
    For i = 2 To .Rows.Count
        crit = .Cells(i, 3) & .Cells(i, 4)
        If .Cells(i, 3) <> "" And Not d.exists(crit) Then
            d(crit) = ""
            .AutoFilter 5, crit 'filtre automatique
            .Offset(1).Copy .Cells(lig, 10) 'copier-coller
            n = .SpecialCells(xlCellTypeVisible).Count / 6
            .AutoFilter 'ôte le filtre
            .Cells(lig, 10).Resize(n, 7).Offset(3).Clear 'ne garde que 3 lignes
            .Cells(lig, 9) = 1
            If .Cells(lig + 1, 10) <> "" Then .Cells(lig + 1, 9) = 2
            If .Cells(lig + 2, 10) <> "" Then .Cells(lig + 2, 9) = 3
            lig = lig + Application.Max(.Cells(lig, 9).Resize(3))
        End If
    Next
    .Columns(14).Delete xlToLeft
    .Columns(5).Delete xlToLeft 'supprime la colonne auxiliaire
    .Rows(1).Copy [I1] 'titres
End With
End Sub
A+
 

Pièces jointes

  • export_complet_tir_competition_505_28122024.xlsm
    36.6 KB · Affichages: 8

LE BLEVEC

XLDnaute Junior
désolé quand on connait Power Query c'est formidable et en plus bien présenté, mais moi je ne l'ai jamais utilisé, je connaissais pas
quand tu me dis remplacer tableau, mais moi je veux replacer les colonnes de A à F par d'autre données qui peut etre d'autre nom, epreuve, categorie, points
alors là mystère, mais tu n'es pas obligé de passer ton temps avec moi
merci pour tout
 

Discussions similaires

Réponses
4
Affichages
737

Statistiques des forums

Discussions
315 260
Messages
2 117 856
Membres
113 354
dernier inscrit
caillet