Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !
Le fichier ne comporte aucune explication concernant un éventuel problème...comment veux-tu que je comprenne ce que tu veux ?bonjour à tous,
En faisant de nouveaux essais, je suisde nouveau face à un problème de changement.
Désolé pour ce contre temps.
Je regarde ton dernier fichier
merci
Une fois encore sois précis : explique-moi pourquoi. Sur quoi est basé ton raisonnement ?à la place de Louis Tom Jonathan, je vois plus, Louis Jonathan Tom
Dans le sens du serpent on traite d'abord Louis.Ce changement de poule doit se faire en suivant l’ordre du serpent. Pour les premiers de poules, il n’y
a pas de problème. Si un second de poule est de la même association que le premier de la poule dans
laquelle il est affecté par le serpent, on le déplacera donc vers la poule de nombre inférieur la plus
proche. Si un troisième de poule est de la même association que le premier ou le second de la poule
dans laquelle il est affecté par le serpent, on le déplacera vers la poule de nombre supérieur la plus
proche. On veillera, évidemment, à ne pas provoquer une nouvelle impossibilité en déplaçant le joueur
concerné de plusieurs poules si besoin est. La mise en place des joueurs doit reprendre à la place qui a été laissée libre par cette manoeuvre.
Si cette partie du règlement interfère négativement sur la répartition, je préfère laisser en l'état.Lorsque des joueurs de même parenté ou d’une même association sont qualifiés dans une même poule
(par exemple s’ils sont en nombre supérieur au nombre de poules) ils doivent y être placés de façon à
se rencontrer au premier tour s’ils sont 2, et le plus rapidement possible s’ils sont 3 ou plus dans la
poule. En vertu du principe de la protection du mieux classé, c’est le moins bien classé qui sera
déplacé.
Si tu lis bien le règlement cette partie n'est pas traitée enBien, je m' aperçois que j'avais occulté une partie du règlement:
Lorsque des joueurs de même parenté ou d’une même association sont qualifiés dans une même poule
(par exemple s’ils sont en nombre supérieur au nombre de poules) ils doivent y être placés de façon à
se rencontrer au premier tour s’ils sont 2, et le plus rapidement possible s’ils sont 3 ou plus dans la
poule. En vertu du principe de la protection du mieux classé, c’est le moins bien classé qui sera
déplacé.
Si cette partie du règlement interfère négativement sur la répartition, je préfère laisser en l'état.
Je veillerai à être plus précis dorénavant.
mais ena) Changement de poule
Cela n'a donc rien à voir avec la constitution des poules. Tu devras la traiter lors de la constitution des tours au sein d'une même poule.b) Dans une même poule
N'oublie pas que si tu fais cela tu peux effectivement te retrouver avec une répartition plus harmonisée mais tu vas également créer des doublons qui n'existent pas : si par exemple tu remplaces Soc par YYY tu te retrouves avec 1 doublon en poule 4 qui n'existait pas (2 fois YYY) et 2 doublons en poule 5 (YYY et Soc) contre un triplon actuellement.Autre remarque dans fichier à prendre en compte, si possibilité.
Ce problème doit être géré dans la poule car c'est une question d'ordre de match et non d'équilibre de poule.J'ai compris les points du règlement, simplement il y a normalement liaison entre le placement et la définition des tours.
Concernant ton histoire de gestion des triplons dans la constitution des poules : un essai ci-joint à tester. Exemple 1
Le « serpent » a donné la poule de 6 suivante (colonne de gauche) :
Les joueurs A1 et A2 appartiennent à la même association. Si on garde l’ordre initial, ces deux joueurs
ne se rencontreront qu’au 5ème tour. On va donc modifier l’ordre de la poule pour qu’ils se jouent au
premier tour
Mais c'est problématique ça parce que normalement cela aurait dû être à toi de me donner la méthode de traitement, d'où mon questionnement du post #111 auquel tu n'as pas répondu...Quand aux triplons, je n'ai pas assimilé la méthode employée.
Mais c'est problématique ça parce que normalement cela aurait dû être à toi de me donner la méthode de traitement, d'où mon questionnement du post #111 auquel tu n'as pas répondu...
Il te reste cependant à travailler sur la répartition des matches (et donc des rotations) au sein de chaque poule avant de passer à la constitution du tableau final qui ne posera pas de problème puisque chaque place de ce tableau est directement dépendant du n° de poule et du classement obtenu par le joueur dans sa poule à l'issue des matches de poule.En général, je choisis parmi ces deux possibilités, après le placement dans les poules:
- Je répartis l'ordre des matchs comme dans le fichier joint.
- Je départage chaque poule, avant la répartition dans le tableau final. Ici, j'ai 4 joueurs par poule donc 6 matchs par poule, ce qui me donne un classement par poule,du 1er au 4ème. Les 1er et second de chaque poule se disputent les places de 1 à 16 et les 3 et 4ème s'affrontent pour les places de 17 à 32, dans un tableau de classement intégral.
Ce mode de traitement "au jugé" est peut-être cohérent pour toi mais ne peut être automatisé puisqu'il ne repose sur rien d'autre que le bon sens de la personne.En fait, lorsque ça arrive, j' équilibre au mieux sans règle établie, en tenant compte au mieux des éléments évoqués. D'où ma question sur la méthode trouvée.
Option Explicit
Sub Répartir()
Dim Pl As Range, PlNom As Range, PlAsso As Range
Dim tNom(), tAsso()
Dim tPouleNom(), tPouleAsso()
Dim tNomAPlacer(), tAssoAPlacer()
Dim i As Long, j As Long, NumNom As Byte, Der_Poule_ligne As Byte
Dim Ligne As Byte, NumPoule As Byte, NbPoule As Byte
Dim NbNomTraité As Byte, PouleRef As Byte, NbNomAPlacer As Byte
Dim MêmeAsso As Boolean
Dim DernJoueur As Long, DernPoule As Byte, DernlLigne As Byte
Range("I1:T100").ClearContents
Set Pl = Range("A1").CurrentRegion
Set PlNom = Pl.Columns(2) 'plage du nom des joueurs
Set PlAsso = Pl.Columns(4) 'plage du nom des associations
tNom = PlNom.Value 'stockage de la plage du nom des joueurs dans un Array
tAsso = PlAsso.Value 'stockage de la plage du nom des associations dans un Array
DernJoueur = PlNom.Rows.Count
DernPoule = Range("Nb_poule").Value
DernlLigne = Application.WorksheetFunction.RoundUp(DernJoueur / DernPoule, 0)
ReDim tPouleNom(1 To DernPoule, 1 To DernlLigne)
ReDim tPouleAsso(1 To DernPoule, 1 To DernlLigne)
ReDim tNomAPlacer(1 To DernPoule)
ReDim tAssoAPlacer(1 To DernPoule)
NumNom = 1
For Ligne = 1 To DernlLigne
If Ligne = 1 Then
For i = 1 To DernPoule
tPouleNom(i, 1) = tNom(i, 1)
tPouleAsso(i, 1) = tAsso(i, 1)
NumNom = NumNom + 1
Next i
Else
If Ligne Mod 2 = 0 Then NumPoule = DernPoule Else NumPoule = 1
Der_Poule_ligne = NumPoule
NbNomTraité = 0
For i = 1 To DernPoule
If NumNom <= DernJoueur Then
tNomAPlacer(i) = tNom(NumNom, 1)
tAssoAPlacer(i) = tAsso(NumNom, 1)
NumNom = NumNom + 1
End If
Next i
For i = 1 To UBound(tNomAPlacer)
If tNomAPlacer(i) <> vbNullString Then
MêmeAsso = False
If tPouleAsso(NumPoule, Ligne) = vbNullString Then
For j = 1 To Ligne - 1
If tPouleAsso(NumPoule, j) = tAssoAPlacer(i) Then
MêmeAsso = True
Exit For
End If
Next j
If MêmeAsso = False Then
tPouleNom(NumPoule, Ligne) = tNomAPlacer(i)
tPouleAsso(NumPoule, Ligne) = tAssoAPlacer(i)
tNomAPlacer(i) = vbNullString
tAssoAPlacer(i) = vbNullString
NbNomTraité = NbNomTraité + 1
NumPoule = Der_Poule_ligne
Else
i = i - 1
If Ligne Mod 2 = 0 Then NumPoule = NumPoule - 1 Else NumPoule = NumPoule + 1
If NumPoule = DernPoule + 1 Or NumPoule = 0 Then
NumPoule = Der_Poule_ligne
i = i + 1
End If
End If
Else
i = i - 1
If Ligne Mod 2 = 0 Then NumPoule = NumPoule - 1 Else NumPoule = NumPoule + 1
'si toutes les poules ont été testées on initialise le compteur de poule et on passe au nom suivant
If NumPoule = 0 Then NumPoule = DernPoule: i = i + 1
If NumPoule = DernPoule + 1 Then NumPoule = 1: i = i + 1
'If NumPoule = 0 Or NumPoule = DernPoule + 1 Then Exit For
End If
End If
Next i
'traitement des noms non placés s'il en reste
If NbNomTraité < DernPoule Then
For i = 1 To DernPoule
'recherche de la 1ère poule qui n'a pas une asso renseignée dans la ligne traitée
NumPoule = Poule_de_reference(tPouleAsso(), Ligne): PouleRef = NumPoule
If tPouleAsso(NumPoule, Ligne) = vbNullString Then
For NbNomAPlacer = 1 To UBound(tNomAPlacer)
If tNomAPlacer(NbNomAPlacer) <> vbNullString Then
For NbPoule = 1 To DernPoule
For j = 1 To Ligne
MêmeAsso = False
' If tPouleAsso(NumPoule, j) = tAssoAPlacer(NbNomAPlacer) Then
If tPouleAsso(NumPoule, j) = tAssoAPlacer(NbNomAPlacer) Or _
tPouleAsso(PouleRef, j) = tPouleAsso(NumPoule, Ligne) Then
MêmeAsso = True
Exit For
End If
Next j
If MêmeAsso = False Then Exit For
If Ligne Mod 2 = 0 Then NumPoule = NumPoule + 1 Else NumPoule = NumPoule - 1
If NumPoule = 0 Or NumPoule = DernPoule + 1 Then Exit For
Next NbPoule
'si une poule ne contenant pas la même association est trouvée on la renseigne
If MêmeAsso = False Then
tPouleNom(PouleRef, Ligne) = tPouleNom(NumPoule, Ligne)
tPouleAsso(PouleRef, Ligne) = tPouleAsso(NumPoule, Ligne)
tPouleNom(NumPoule, Ligne) = tNomAPlacer(NbNomAPlacer)
tPouleAsso(NumPoule, Ligne) = tAssoAPlacer(NbNomAPlacer)
tNomAPlacer(NbNomAPlacer) = vbNullString
tAssoAPlacer(NbNomAPlacer) = vbNullString
NbNomTraité = NbNomTraité + 1
'sinon on place la paire nom/asso dans la poule de référence
Else
tPouleNom(PouleRef, Ligne) = tNomAPlacer(NbNomAPlacer)
tPouleAsso(PouleRef, Ligne) = tAssoAPlacer(NbNomAPlacer)
tNomAPlacer(NbNomAPlacer) = vbNullString
tAssoAPlacer(NbNomAPlacer) = vbNullString
NbNomTraité = NbNomTraité + 1
End If
If NbNomTraité = UBound(tNomAPlacer) Then Exit For 'si tous les noms sont placés on sort
's'il existe encore un nom non placé on recalcule la poule de référence
NumPoule = Poule_de_reference(tPouleAsso(), Ligne): PouleRef = NumPoule
End If
Next NbNomAPlacer
End If
If NbNomTraité = UBound(tNomAPlacer) Then Exit For
If Ligne Mod 2 = 0 Then NumPoule = NumPoule + 1 Else NumPoule = NumPoule - 1
Next i
End If
End If
'on lance la procédure permettant d'équilibrer les poules
If Ligne > 2 Then Call Equilibrer_poule(tPouleNom(), tPouleAsso(), Ligne, DernPoule)
Next Ligne
'report du tableau des joueurs
Range("I1").Resize(UBound(tPouleNom, 2), UBound(tPouleNom, 1)) = Application.Transpose(tPouleNom)
'report du tableau des associations (uniquement pour contrôler)
Range("I21").Resize(UBound(tPouleAsso, 2), UBound(tPouleAsso, 1)) = Application.Transpose(tPouleAsso)
End Sub
'Ce code est lancé à chaque ligne à partir de la ligne 3.
'Il permet de vérifier l'équilibre de la répartition des associations dans les poules.
Sub Equilibrer_poule(tPouleNom(), tPouleAsso(), Ligne As Byte, DernPoule As Byte)
Dim i As Long, j As Long, k As Byte, l As Byte
Dim NbAsso As Byte, tempNom As String, tempAsso As String
Dim tTemp(), FinTraitement As Boolean
Dim NbAssoPouleRef As Byte, NbAssoRef As Byte
'Dans chaque poules on compte le nombre de fois où l'asso de la dernière ligne est déjà présente dans la poule.
'Si cette asso est déjà présente au minimum 2 fois on stocke dans un tableau temporaire le nom de l'asso,
'le n° de la poule et le nombre de fois où elle est déjà présente dans cette poule.
For i = 1 To DernPoule
NbAsso = 0
For j = 1 To Ligne - 1
If tPouleAsso(i, Ligne) = tPouleAsso(i, j) Then
NbAsso = NbAsso + 1
End If
Next j
If NbAsso >= 2 Then
k = k + 1
ReDim Preserve tTemp(1 To 3, 1 To k)
tTemp(1, k) = tPouleAsso(i, Ligne) 'nom de l'asso placée à la dernière ligne de la poule
tTemp(2, k) = i 'n° de la poule
tTemp(3, k) = NbAsso 'nombre de fois où l'asso est déjà présente dans la poule
End If
Next i
NbAsso = 0
'Si le tableau comporte au moins 1 association on lance la partie qui suit
If k > 0 Then
'On traite les associations stockées dans le tableau dans l'ordre indiqué par le sens du serpent :
'- en commençant par la 1ère asso si l'on traite une ligne impaire
'- en commençant par la dernière asso si l'on traite une ligne paire
For i = IIf(Ligne Mod 2 <> 0, 1, UBound(tTemp, 2)) To IIf(Ligne Mod 2 <> 0, _
UBound(tTemp, 2), 1) Step IIf(Ligne Mod 2 <> 0, 1, -1)
'on traite les poules stockées dans l'ordre indiqué par le sens du serpent :
'- en commençant par la 1ère poule si l'on traite une ligne impaire
'- en commençant par la dernière poule si l'on traite une ligne paire
'
'A chaque rotation on compare donc la poule testée dans cette rotation
'avec la poule où se trouve l'asso redondante stockée dans le tableau (appelée "poule de référence")
For j = IIf(Ligne Mod 2 <> 0, 1, DernPoule) To IIf(Ligne Mod 2 <> 0, DernPoule, 1) _
Step IIf(Ligne Mod 2 <> 0, 1, -1)
NbAsso = 0: NbAssoPouleRef = 0: NbAssoRef = 0
If tTemp(2, i) <> j Then
If tPouleAsso(j, Ligne) <> tTemp(1, i) Then
'On compte le nombre de fois où l'asso répertoriée dans le tableau
'est présente dans la poule testée
For l = 1 To Ligne
If tPouleAsso(j, l) = tTemp(1, i) Then
NbAsso = NbAsso + 1
End If
'On compte le nombre de fois où l'asso de la ligne
'de la poule testée est présente dans la poule de référence
If tPouleAsso(tTemp(2, i), l) = tPouleAsso(j, Ligne) Then
NbAssoPouleRef = NbAssoPouleRef + 1
End If
'On compte le nombre de fois où l'asso de la ligne de la poule testée
'existe déjà dans cette même poule
If tPouleAsso(j, l) = tPouleAsso(j, Ligne) Then
NbAssoRef = NbAssoRef + 1
End If
If l = Ligne Then FinTraitement = True 'quand toutes les lignes de la poule sont testées on passe à la suite
Next l
'La suite du traitement dépend des critères de modification que l'on se fixe pour permuter la place de l'asso
'placée dans la poule testée avec celle placée dans la poule de référence (stockée dans le tableau temporaire) :
'1)si l'on autorise la permutation à partir du moment où le nombre de présence de l'asso présente dans la poule testée
'est inférieur à 2 la condition choisie est "If NbAsso < 2 Then"
'2)si l'on autorise la permutation à partir du moment où le nombre de présence de l'asso présente dans la poule testée
'est inférieur à celui de la poule de référence la condition choisie est "If NbAsso < tTemp(3, i) Then"
'3)Si l'on ajoute au critère 2 le fait de n'autoriser la permutation que si l'asso de la poule testée est également moins
'présente dans la poule de référence on choisit comme condition
'"If NbAsso < tTemp(3, i) And NbAssoPouleRef <= NbAssoRef Then"
If FinTraitement = True Then
FinTraitement = False
'If NbAsso < 2 Then
If NbAsso < tTemp(3, i) Then
'If NbAsso < tTemp(3, i) And NbAssoPouleRef <= NbAssoRef Then
tempNom = tPouleNom(tTemp(2, i), Ligne)
tempAsso = tPouleAsso(tTemp(2, i), Ligne)
tPouleNom(tTemp(2, i), Ligne) = tPouleNom(j, Ligne)
tPouleAsso(tTemp(2, i), Ligne) = tPouleAsso(j, Ligne)
tPouleNom(j, Ligne) = tempNom
tPouleAsso(j, Ligne) = tempAsso
Exit For
End If
End If
End If
End If
Next j
Next i
End If
End Sub
Function Poule_de_reference(tPouleAsso(), Ligne As Byte) As Byte
Dim j As Long
For j = IIf(Ligne Mod 2 <> 0, 1, UBound(tPouleAsso)) To _
IIf(Ligne Mod 2 <> 0, UBound(tPouleAsso), 1) Step IIf(Ligne Mod 2 <> 0, 1, -1)
If tPouleAsso(j, Ligne) = vbNullString Then
Poule_de_reference = j: Exit For
End If
Next
End Function
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?