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
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 !
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...
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 !
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)
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
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 !