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.

12simulation.xlsx (14.96 Ko)

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 ! Elle n'est pas rattachée à un bouton, mais tu peux la lancer par la boîte de dialogue Macro.

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 Sub

Commentaires 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 , j'avais pas idée de ce que l'on pouvait mettre en place , je vais tester tout ça pour voir ce que cela nous donne , encore un grand merci à toi!

Rechercher des sujets similaires à "calculer temps fonction sexe"