Classement par catégories

Bonjour à tous

Suite de mes pérégrinations avec mon tableur qui devrait nous servir à terme à organiser nos classements fédéraux de trails et autres courses pédestres, après une première étape qui permet de classer les équipes incluant au moins une féminine brillamment solutionnée par MFerrand je me lance aujourd'hui sur le rapatriement de mes coureurs dans des onglets catégories.

A partir du classement général je souhaite

1) comptabiliser le nombre d'arrivants par catégories au fur et a mesure.

Exemple: la catégorie VH1 le premier du général est le 1er VH1 le 3 eme du général est le second de sa catégorie VH1 , je souhaite le faire apparaître dans la colonne place catégorie .

2) A partir du classement de la colonne place Catégorie , j'aimerais rapatrier de manière automatisée dans des onglets séparés les arrivants hommes et femmes de chaque catégories

Exemple les seniors 1 que j'ai noté manuellement dans l'onglet

Tout ceci ayant pour but d'éviter des erreurs de saisies manuelles

je vous joint le fichier exemple

Merci par avance

Un jour je serai grand

Le fichier exemple est introuvable

oups il est pas passé je reposte

Bonjour runshaft,

Voyez si le fichier joint répond à vos attentes

C'est top ! ca fonctionne , j'ai juste pas trop compris comment fonction indirect avec les colonnes masquées

Salut !

N'étant pas encore en mesure de me lancer dans des activités domestiques, qui m'attendent mais réclament un certain effort physique , j'ai entrepris de te faire l'équivalent de la procédure Equipes pour les catégories...

En commençant par la mise en place des feuilles : suppression contenu quand elles existent, création quand elles n'existent pas, préparation des en-têtes...

Petite difficulté avec tes noms de feuille encadrés d'espaces ! qui ont été doublées puisque non reconnues, mais une fois supprimées, tout rentre dans l'ordre...

Puis tri préalable de la base : catégories (avec ordre personnalisé des catégories), sexe, temps...

Reste à faire la répartition...

Cordialement.

Génial dis donc ça va donner un fichier hyper complet ! On va pouvoir aborder les classements au sein de nos courses de manière plus sérieuse (les derniers classements 2018 étaient encore effectués a la main !!!! )

Salut,

Y aura un petit délai ! J'ai fait quelques autres trucs entretemps, et lorsque j'y suis revenu, ton fichier m'a fait une série de plantage d'Excel à répétition à l'enregistrement avec récupération... Apparemment j'ai fini par m'en dépatouiller, avoir le fichier enregistré, avec la macro en l'état d'avancement atteint, et qui ne plante plus ! Je ne saurai pas ce qui s'est passé, mais si ça dure, on va pouvoir poursuivre... après café !

Bon ! Voilà la procédure. Je l'ai raccordée à un bouton "Catégories"...

Sub ClassCatégSexe()
    Dim ws1 As Worksheet, aa, Cat, FCat, col, TCatH(), TCatF()
    Dim nLstCat%, i%, j%, c%, dC%, fC%, CatExist(1) As Boolean
    'Mise en place et préparation des feuilles Catégories
    FCat = Split("Seniors 1;Seniors 2;Vétérans 1;Vétérans 2", ";")
    Cat = Split("Scratch Nom Prénom Club Temps")
    Set ws1 = ActiveSheet
    Application.ScreenUpdating = False
    On Error Resume Next
    For i = 3 To 0 Step -1
        Worksheets(FCat(i)).UsedRange.Clear
        If Err.Number <> 0 Then
            Worksheets.Add.Name = FCat(i)
            Err.Clear
        End If
        Worksheets(FCat(i)).Move after:=ws1
        With Worksheets(FCat(i))
            .Range("A1") = "Hommes": .Range("G1") = "Femmes"
            .Range("A2").Resize(, 5).Value = Cat
            .Range("G2").Resize(, 5).Value = Cat
            .Rows("1:2").RowHeight = 30
            .Columns("A:K").ColumnWidth = 15
            .Columns("F").ColumnWidth = 6
            With .Range("A1:K2")
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .Font.Bold = True
            End With
            .Range("A1:E1").Merge: .Range("G1:K1").Merge
            .Range("A1:E2").Borders.Weight = xlThin
            .Range("G1:K2").Borders.Weight = xlThin
        End With
    Next i
    On Error GoTo 0
    ws1.Activate
    'Tri préalable par Catégorie (avec ordre personnalisé), puis Temps
    Cat = Split("sh1 sf1 sh2 sf2 vh1 vf1 vh2 vf2")
    With Application
        .AddCustomList Cat
        nLstCat = .GetCustomListNum(Cat)
    End With
    With ws1.Range("A3").CurrentRegion
        .Sort ordercustom:=nLstCat + 1, key1:=.Cells(1, 8), order1:=xlAscending, _
         key2:=.Cells(1, 2), order2:=xlAscending, Header:=xlYes
        aa = .Value
    End With
    Application.ScreenUpdating = True
    'Récupération des données catégories en 2 tableaux H et F par catégorie
    ' et insertion dans feuille catégorie
    col = Array(9, 3, 4, 7, 2)
    For i = 2 To UBound(aa)
        dC = i: fC = dC
        If LCase(aa(dC, 8)) = Cat(c) Then
            Do While fC + 1 <= UBound(aa)
                If aa(fC + 1, 8) = Cat(c) Then fC = fC + 1 Else Exit Do
            Loop
            ReDim TCatH(fC - dC)
            For j = 0 To fC - dC
                TCatH(j) = WorksheetFunction.Index(aa, dC + j, col)
            Next j
            dC = fC + 1: fC = dC: CatExist(0) = True
        End If
        If LCase(aa(dC, 8)) = Cat(c + 1) Then
            Do While fC + 1 <= UBound(aa)
                If aa(fC + 1, 8) = Cat(c + 1) Then fC = fC + 1 Else Exit Do
            Loop
            ReDim TCatF(fC - dC)
            For j = 0 To fC - dC
                TCatF(j) = WorksheetFunction.Index(aa, dC + j, col)
            Next j
            CatExist(1) = True
        End If
        If CatExist(0) Or CatExist(1) Then
            With Worksheets(FCat(c / 2))
                If CatExist(0) Then
                    With .Range("A3").Resize(UBound(TCatH) + 1, 5)
                        .Value = WorksheetFunction.Transpose(WorksheetFunction _
                         .Transpose(TCatH))
                        .Borders.Weight = xlThin
                        .Columns(1).HorizontalAlignment = xlCenter
                        With .Columns(5)
                            .HorizontalAlignment = xlCenter
                            .NumberFormat = "h:mm:ss"
                        End With
                    End With
                End If
                If CatExist(1) Then
                    With .Range("G3").Resize(UBound(TCatF) + 1, 5)
                        .Value = WorksheetFunction.Transpose(WorksheetFunction _
                         .Transpose(TCatF))
                        .Borders.Weight = xlThin
                        .Columns(1).HorizontalAlignment = xlCenter
                        With .Columns(5)
                            .HorizontalAlignment = xlCenter
                            .NumberFormat = "h:mm:ss"
                        End With
                    End With
                End If
            End With
            i = fC: Erase TCatH: Erase TCatF: Erase CatExist
        Else
            i = i - 1
        End If
        c = c + 2: If c > UBound(Cat) Then Exit For
    Next i
    'Rétablissement classement individuel (tri par Temps)
    With ActiveSheet.Range("A3").CurrentRegion
        .Sort key1:=.Cells(1, 2), order1:=xlAscending, Header:=xlYes, ordercustom:=1
    End With
    Application.DeleteCustomList nLstCat
End Sub

J'ai eu deux problèmes, dont un que je viens juste de résoudre !

Apparemment, le plantage d'Excel que j'avais semblait lié à la liste de tri personnalisée, c'est sa suppression qui provoquait le plantage, et j'avais réglé le problème lors de la première série en supprimant la suppression de la liste.

J'avais pensé que c'était le fait de la supprimer juste après qu'elle ait été utilisée dans un tri qui posait problème.

J'ai donc placé sa suppression à la fin après tri de rétablissement du classement individuel...

Et à nouveau plantage à l'enregistrement ! En regardant de plus près j'ai fini pas voir que même si la liste n'était pas utilisable lors du tri effectué, elle demeurait mémorisée pour le tri !

Ma supposition de départ était donc bien la bonne, mais il fallait définir un tri éliminant explicitement la personnalisation pour pouvoir ensuite supprimer la liste elle-même !

Un problème réglé.

L'autre était que dans un premier temps j'obtenais les résultats pour les deux feuilles Seniors mais les feuilles Vétérans restaient vides !!

Constatant que la colonne I pour le premier comportait un résidu de formule (qui donnait d'ailleurs un rang faux), j'ai rétabli 1 en éliminant la formule, et là tout est rentré dans l'ordre.

Je n'ai pas bien compris pourquoi cela affectait la totalité des catégories vétérans en l'absence d'erreur d'exécution. Cette colonne faisant partie des données prélevées, cela a pu provoquer un dysfonctionnement de la fonction Index et le tableau de recueil concerné, mais je ne vois pourquoi les suivants s'évanouissait aussi alors que la procédure allait au bout... Le problème paraît tout de même réglé.

Reste à voir si tout est OK !

Cordialement.

Décidément tu m'épates tu as un compilé un VBA en 2h alors que j'y aurai passé une(plusieurs ? ) soirées.

Je teste tout ça pour voir et te faire un retour en cas de soucis

Si j'ai des catégories à rajouter dans le code (après avoir ajouté les feuillets correspondants ) je modifie à

FCat = Split("Juniors;Seniors 1;Seniors 2;Vétérans 1;Vétérans 2;Vétérans 3;Vétérans 4;Vétérans 5", ";")

et

Cat = Split("jh jf sh1 sf1 sh2 sf2 vh1 vf1 vh2 vf2 vh3 vf3 vh4 vf4 vh5 vf5")

?

bonne fin de dimanche (je suis devant mon café )

OK ! J'envisage de passer à l'apéro (la nuit est quasiment tombée) avant de me mettre à cuisiner !

Bonjour à toi MFerrand

Bon j'ai testé le fichier qui fait bien ce que l'on lui demande

Pour l'automatiser un peu plus j'ai essayé d'affecter la place en fonction de la catégorie

ex : quand je lui donne la catégorie VH1 du coureur , je voudrais qu 'il reporte de lui même le nombre dans la colonne place catégorie

(ce qui fera se remplir le tableau sans risque d'omettre un coureur )

Le tableau final comportera 9 onglets de catégories allant de cadets à V5

j'ai modifié la macro (enfin j'ai tenté !) pour inclure l'ensemble des catégories ,j'ai fait arriver un vh3 bon visiblement je suis pas au point

erreur

Si tu peux m'apporter tes lumières

j'ai joint le tableau avec l'ensemble des catégories

La proc. est ajustée pour inclure jusqu'à vf5.

(NB- les catégorie vont systématiquement par couple, quand tu mets vh3 il faut mettre en même temps vf3, car hommes et femmes sont traités dans le même tour de boucle, donc quand homme est traité il poursuit avec femmes, mais il faut qu'il trouve la mention, sinon erreur. Et pas d'espace supplémentaire dans les chaînes splittées avec d'autres caractères que l'espace, sans quoi l'espace se retrouvera dans le nom listé et faussera la reconnaissance).

Mais les autres catégories évoquées ne sont pas encore introduites.

Je n'ai pas bien compris l'autre question, mais à tout hasard j'ai établi une proc de classement catégorie, rattachée à un bouton. Une fois le classement individuel rempli, tu cliques, et ça remplit la colonne I.

Cordialement.

Parfait le bouton place catégories c'était bien ce que je souhaitais obtenir, pour etre sur d'avoir oublié personne dans une catégorie (ça à été le cas cette année lors d'un championnat) .

Il ne reste plus que les jeunes catégories cadets et juniors à inclure dans la boucle et on va friser la perfection

On va tout de suite apparaitre plus sérieux avec un fichier automatisé lors des importations de classements depuis le chronométrage

Bonjour @mferrand

me voila de retour apres avoir essayer de finaliser le fichier que tu m'avais fait

j'ai essayé (je suis vraiment pas doué en vba .... ) d'ajouter les onglets des catégories cadets juniors aux onglets et j 'obtiens .....les cadets qui s'intègrent bien visiblement par contre mes places par catégories font apparaitre non pas la place mais leur catégories .

et pour les juniors il m'a bien rapatrié la première féminine mais le premier masculin (et toujours un souci quant à la place par caté) ...

en gros j'ai réussi ....à moitié et je vois pas pourquoi les cadets fonctionnent et pas les juniors

je te remets le fichier avec mes modifs.....si tu peux me dire ce qui cloche

Merci d'avance à toi

14classements-v4.xlsm (60.10 Ko)

Bonjour,

Tu l'as complétée sur la proc. de répartition par catégorie, reste à le faire sur la proc d'insertion du classement catégorie :

    Cat = Split("ch cf jh jf sh1 sf1 sh2 sf2 vh1 vf1 vh2 vf2 vh3 vf3 vh4 vf4 vh5 vf5")

Bon dimanche.

Hello MFerrand,

j'crois qu'il manque un paramètre ! il me semble que ça serait :

Cat = Split("ch cf jh jf sh1 sf1 sh2 sf2 vh1 vf1 vh2 vf2 vh3 vf3 vh4 vf4 vh5 vf5", " ")

dhany

Salut Dhany !

L'espace est le séparateur par défaut pour Split et Join, lorsqu'il est omis c'est donc l'espace...

Bon dimanche

NB- Pas de panne au journal télévisé, on est en hiver !

Bonjour tout le monde !

Et non dhany, le séparateur pas défaut est l'espace il te suffit de tester ce code :

Dim Cat
Cat = Split("ch cf jh jf sh1 sf1 sh2 sf2 vh1 vf1 vh2 vf2 vh3 vf3 vh4 vf4 vh5 vf5")
MsgBox UBound(Cat)

Oups, désolé par rafraîchi !

Rechercher des sujets similaires à "classement categories"