Calculer les temps en fonction du sexe
Salut à tous !
Je suis en train de me faire un noeud au cerveau avec une formule que je cherche à mettre en place pour effectuer des classements par équipes en fonction d'un paramètre il faut au moins une féminine dans les classés: je m'explique !
soit une équipe de 5 participants avec Pierre Gaetan Marc Cédrick et Julie
admettons que nos participants termine dans l'ordre suivant:
Pierre 45'30"
Gaetan 45'45"
Marc 48'00"
Cédrick 48'20"
Julie 48'35"
Mon classement par équipe se basant sur 1 féminine au moins pour 3 hommes, j'aurai besoin pour effectuer mon classement de prendre les 3 premiers temps des hommes et le temps de ma féminine pour avoir un classement exact (dans le cas présent Cédrick ne rentre pas dans l'équipe en fait ! )
J'ai essayé en partant de Nb.si avec une colonne homme/femme mais du coup ça ne fonctionne pas .
je vous ai joint mon fichier pour essayer d'y voir plus clair
Merci d'avance de vos lumières
tof
Bonjour,
Ta formule fonctionnera ainsi :
=NB.SI(H:H;"F")mais je ne vois pas bien à quoi elle te sert...
Tu veux prendre les 3 premiers hommes et la première femme, systématiquement. Ou bien le 4 premiers en ne validant que si au moins une femme dans les 4 (donc il pourrait y en avoir plus d'une).
Si pas le cas, on élimine les hommes suivants les 3 premiers jusqu'à ce qu'on tombe sur une femme ?
Merci de ta réponse rapide !
Oui en effet l'idée c'est qu'il y ai au moins une femme dans l'équipe de 4 mais il peut y en avoir plus d'une ...donc dans l'absolu on pourrait avoir 6 ou 7 hommes du meme club (et n'en garder que 3 ) avant d'avoir une femme , on pourrait aussi avoir le cas de figure ou l'équipe se compose de 2 femmes et 2 hommes ou 3 femmes et 1 hommes , le classement imposant une mixité .
le nb.si n'est qu'un point de départ mais je ne sais pas si il est le plus adapté
Je viens de voir que ma réponse suivante est passée à la trappe (rupture momentanée de réseau ! au mauvais moment pour moi !
Je résume mon propos : en se référant à ton listage d'une équipe classée par temps, on peut dans une colonne placer une formule qui indiquera qui est à retenir. A partir de là on peut faire le calcul destiné au classement équipe (total ? moyenne ? ??)
La question est de définir comment tu présentes tes données et comment tu veux les résultats...
Cependant, dans un cas pareil, je serais tenté d'extraire les résultats par VBA, ce qui éviterait une cascade de formules...
Cordialement.
Les soucis réseaux je connais ça .....
Pour le classement il se réalise au temps cumulé des 4 coureurs (coureuses)
si on reprend l'exemple de départ on additionne les temps des 3 premiers hommes et de la féminine
Effectivement en formules ça risque d'être une belle cascade le VBA parait surement moins compliqué à mettre en oeuvre ...
VBA : on prend les données nécessaires aux calculs, on fait les calculs hors feuille, et on les restitue à la fin là où on les veux...
Sous cet angle cela présente l'avantage de ne pas laisser de traces intermédiaires...
Donc ça sera du VBA ....par contre je veux bien une trame de départ pour le code VBA ......si c'est pas trop demander
Tu n'as qu'une équipe ?
Je pense qu'il faudrait que tu modélises la façon dont tu engranges tes données, par exemple la listes des coureurs avec les temps... et l'emplacement des résultats.
Avec VBA, on a besoin de savoir où trouver les données à traiter, et où poser les résultats, entre les deux on peut s'en débrouiller... !
ok je t'envoie une simulation des derniers championnats pour que tu puisse te rendre compte
Merci en tout cas pour tes pistes.
Bonjour,
Sinon j'ai trouvé ça si tu n'aimes pas le VBA et que le résultat te convient :
EDIT: Ok, vu ta simulation, ça ne va pas le faire
Re,
Si je comprends bien ton tableau, l'objectif est de partir du classement individuel pour produire le classement par équipes figurant sur le tableau du dessous ?
Oui c'est bien ça ......et malgré mes quelques notions d'excel je sèche lamentablement , je sais pas par quel bout le prendre ...
OK ! Je note aussi la méthode particulière de notation des temps... Pas gênant, mais à condition qu'elle soit générale pour ce tableau. On fera les conversions.
Oui il ne sont pas dans le bon format .... on appliquera le format heure ça fera plus propre
Bon, ce format, type 0,00,00 est artificiel, mais si l'on tape bien sous cette forme, 5 chiffres et 2 virgules, on obtient une chaîne (texte) qui de plus permet de trier selon les temps...
En les reprenant, j'effectuerai une conversion en temps (pour pouvoir les additionner), mais ce qu'il faut savoir c'est si on part de temps notés de cette façon ou si on aura des valeurs temps... Le tout est de savoir si l'on a à faire une conversion ou non (sur le modèle, il faudra de toute façon en faire une...)
Cordialement.
Merci de ton coup de main
l'idéal est de les rentrer directement en valeur temps pour obtenir quelque chose de propre et d'éviter de remodifier les cellules en cas de grand nombre d'arrivants .
Le modèle fourni est actuellement utilisé pour les classements de nos championnats mais on peut dire qu'il est largement perfectible
Merci de ton coup de main
Attend demain pour ça !
C'est à toi de voir comment tu veux faire évoluer ton modèle... Je me borne à traiter les données pour les fournir remises en forme en fonction du format de présentation des résultats.
Je laisserai la procédure de conversion à part, de façon qu'elle puisse être utilisée indépendamment.
Une idée de la méthode que j'envisage :
- Tri pour faciliter la détection des équipes à classer
- Tableau des équipes : temps global, équipe (soit un tableau, inclus dans le tableau)
- Tri de ce tableau par temps
- Affectation selon classement.
Je réserve encore une possibilité de variation sur la méthode de détection des équipes, mais c'est à la marge. On verra si des difficultés apparaissent ailleurs, mais a-priori pas de raison...
Tiens-tu à garder les résultats équipes sur la même feuille, ou une feuille distincte ? (le classement individuel pourrait être de longueur variable...)
Cordialement.
Ca me parait très complet tout ça ....
effectivement le classement par équipes sur un onglet séparé parait une bonne option (on pourra ajuster les classements individuels en fonction des arrivants sur la feuille 1 et le classement équipe sur la feuille 2 .
cordialement
Bonjour,
Tu trouveras dans ton fichier une procédure de conversion en temps des données de la colonne B (bouton Convertir...). Pour que tu puisses la tester, j'en ai fait une seconde qui rétablit les chaînes de la forme 0,00,00 à partir des temps !
Il te faut donc convertir en temps avant de passer au classement des Equipes (celle-ci est rattachée à un bouton, donc il n'y a qu'à cliquer...). Pour le classement des équipes, la procédure est aussi rattachée à un bouton.
Sub ClassementEquipes()
Dim aa, kEq, TEqu(), Tmp(3), i%, j%, n%, dE%, fE%, Eqp4%, Eq$, MF As Boolean
'Tri préalable par Club, puis Temps
With ActiveSheet.Range("A3").CurrentRegion
.Sort key1:=.Cells(1, 7), order1:=xlAscending, key2:=.Cells(1, 2), _
order2:=xlAscending, Header:=xlYes
aa = .Value
End With
'Détection équipes, recueil des données équipes
kEq = Array(2, 3, 4, 5, 8, 7)
For i = 2 To UBound(aa)
Eq = aa(i, 7): dE = i: fE = i
Do While fE + 1 <= UBound(aa)
If aa(fE + 1, 7) = Eq Then fE = fE + 1 Else Exit Do
Loop
If fE - dE >= 3 Then
For j = 0 To 3
Eqp4 = Eqp4 + IIf(aa(dE + j, 5) = "M", 1, 2)
Next j
If Eqp4 > j And Eqp4 < j * 2 Then
Eqp4 = j - 1: MF = True
Else
Do While dE + j <= fE
Eqp4 = Eqp4 + IIf(aa(dE + j, 5) = "M", 1, 2)
j = j + 1
If Eqp4 > j Or Eqp4 < j * 2 Then
Eqp4 = j - 1: MF = True: Exit Do
End If
Loop
End If
If MF Then
n = n + 1: ReDim Preserve TEqu(1, n)
For j = 0 To 2
Tmp(j) = WorksheetFunction.Index(aa, dE + j, kEq)
TEqu(0, n) = TEqu(0, n) + aa(dE + j, 2)
Next j
Tmp(3) = WorksheetFunction.Index(aa, dE + Eqp4, kEq)
TEqu(0, n) = TEqu(0, n) + aa(dE + Eqp4, 2)
TEqu(1, n) = Tmp
End If
End If
i = fE
MF = False: Eqp4 = 0: Erase Tmp
Next i
'Tri des équipes selon Temps global
For i = 1 To n - 1
For j = i + 1 To n
If TEqu(0, j) < TEqu(0, i) Then
TEqu(0, 0) = TEqu(0, j): TEqu(1, 0) = TEqu(1, j)
TEqu(0, j) = TEqu(0, i): TEqu(1, j) = TEqu(1, i)
TEqu(0, i) = TEqu(0, 0): TEqu(1, i) = TEqu(1, 0)
End If
Next j
Next i
'Composition tableau classement Equipes
With Worksheets("Equipes")
'Nettoyage classement antérieur éventuel
.Range("A3").CurrentRegion.Clear
'Ligne d'en-tête
kEq = Split("Scratch;Temps;;Nom;Prénom;Sexe;Catégorie;Club", ";")
With .Range("A3").Resize(, 8)
.Value = kEq
.HorizontalAlignment = xlCenter
.Cells(1, 2).Resize(, 2).Merge
End With
'Classement Equipes
For i = 1 To n
With .Range("C" & i * 4).Resize(4)
.Resize(, 6).Value = WorksheetFunction.Transpose(WorksheetFunction. _
Transpose(TEqu(1, i)))
With .Offset(, -1)
.Cells(1, 1) = TEqu(0, i)
.NumberFormat = "h:mm:ss"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Merge
End With
With .Offset(, -2)
.Cells(1, 1) = i
.Font.Bold = True
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Merge
End With
End With
Next i
'Finalisation mise en forme
With .Range("A3").CurrentRegion
.Columns("H").AutoFit
With .Columns("C")
.NumberFormat = "h:mm:ss"
.HorizontalAlignment = xlCenter
End With
.Columns("F:G").HorizontalAlignment = xlCenter
.Borders.Weight = xlThin
End With
For i = 1 To n
.Range("A" & i * 4).Resize(4, 8).BorderAround xlContinuous, xlMedium
Next i
End With
'Rétablissement classement individuel (tri par Temps)
With ActiveSheet.Range("A3").CurrentRegion
.Sort key1:=.Cells(1, 2), order1:=xlAscending, Header:=xlYes
End With
'Affichage Equipes
Worksheets("Equipes").Activate
End SubCommentaires des différentes opérations réalisées -
Tri préalable : On opère à partir du classement inidviduel et pour faciliter la détection des équipes on trie ces données par Club, et par temps pour chaque Club. Les clubs seront donc regroupés et les membres classés par temps.
Ceci fait, on récupère les données dans un tableau (aa) plus facile à rapide à travailler que sur la feuille...
Détection des équipes : Il y a deux conditions, la première étant qu'il y ait au moins 4 membres du club.
On démarre une boucle sur les lignes de notre tableau (en fait cette boucle avancera par sauts comme on va le voir). On récupère le nom du Club de la première ligne et on vérifie au moyen d'une nouvelle boucle interne si le nom de ce club se retrouve sur les lignes suivantes. On consigne nos résultats dans deux variables : dE, première ligne du club, fE, dernière ligne du même club.
Si fE-dE est inférieur à 3, c'est qu'il y a moins de 4 membres de ce club, donc pas une équipe, on peut passer au club suivant, on corrige la variable de boucle initiale i en lui donnant la valeur de fE, de façon qu'en s'incrémentant on tombe sur un nouveau club...
Si le club est éligible au statut d'équipe, il faut dans ce cas tester sa composition qui doit être mixte. On récupère donc pour classer l'équipe les 4 premiers, sachant que si ces 4 ne fournissent pas une composition mixte, on substituera au 4e un suivant (s'il y en a) du sexe faisant défaut dans les 3 premiers.
On cumule donc dans une variable Eqp4 des valeurs 1 si le sexe est "M" ou 2 s'il ne l'est pas, au moyen d'une boucle faisant varier j de 0 à 3. Au terme de la boucle, si la variable vaut 4 ou vaut 8 l'équipe ne peut être composée des 4 premiers car elle serait exclusivement masculine (4) ou féminine (8). Si la variable a une valeur comprise entre 4 et 8, c'est qu'elle est mixte.
Nota: au sortir de la boucle de 0 à 3, j a la valeur 4, ce pourquoi on l'utilise pour tester la valeur (comprise entre j et j*2).
Si à ce stade, notre équipe est mixte, on enregistre le fait dans une variable booléenne MF qui prend la valeur True, et on affecte la valeur j-1 à la variable Eqp4. Ici ce sera 3, soit l'indice du 4e équipier dans le club en partant de 0.
Nota: on sait qu'on prend les 3 premiers (indices 0 à 2) + un autre qui peut être le 4e (indice 3) ou un suivant si le 4e ne satisfait pas la condition équipe.
Si l'on n'a pas notre équipe avec les 4 premiers, on poursuit donc avec j qui vaut alors 4, notre variable Eqp4 qui contient 4 ou 8, dans une nouvelle boucle sur les membres suivants du club (tant qu'on en trouve) en poursuivant le cumul de 1 ou 2 et (après incrémentation de j) test pour savoir si le membre ajouté rétablit la mixité. Si c'est le cas, on affecte l'indice du membre (qu'on obtient pareillement par j-1) et on passe la variable MF à True.
Si on n'a pas d'équipe, on boucle pour le club suivant...
Recueil des données Equipe : Si on a bien suivi la détection précédente on sait que l'on va trouver les 3 premiers membres de l'équipe aux lignes dE+j (j variant de 0 à 2), et la 4e à la ligne dE+Eqp4.
Les données à récupérer pour chaque membre figurent aux colonnes 2, 3, 4, 5, 8, 7 du tableau (ordre de récupération). On constitue donc un tableau kEq de ces numéros de colonnes.
On va récupérer ces valeurs concernant chaque membre sous forme de tableau qu'on affecte à un tableau Tmp de 4 éléments (0 à 3), en utilisant la fonction Excel Index.
Index(tableau de données, ligne, tableau de colonnes), soit Index(aa, dE + j, kEq) [j étant remplacé par Eqp4 pour le 4e équipier], va nous permettre de recueillir les données concernant chaque membre sous forme de tableau affecté provisoirement au tableau Tmp.
Au passage, je dois adresser un remerciement à Klin89 pour l'utilisation d'un tableau d'index de colonnes avec Index, je n'y avais pas pensé avant de le voir l'utiliser !
Notre tableau de recueil final des données équipes est un tableau dynamique TEqu à 2 éléments dans sa première dimension, et dont on incrémente la seconde au fil des équipes trouvées. Dans l'élément (0, n) on cumule les temps des membres de l'équipe. Et on affecte le tableau Tmp à l'élément (1, n)...
Mise en ordre des équipes : on opère un tri pour mettre les équipes dans l'ordre des temps.
Affectation des données : L'essentiel du code relatif à la composition du classement équipes relève de mises en forme, je ne m'y étends pas. Pour ce qui est des affectations de données proprement dites, on procède équipe par équipe : bloc des 4 lignes de l'équipe des colonnes C à H par double transposition de notre tableau de tableaux de lignes de données de l'équipe, temps global en colonne B et rang en colonne A.
Cordialement.
Bonjour à toi
je suis impressionné du boulot accompli , effectivement ça dépasse de loin mes compétences en VBA