Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

Bonjour, David, Cisco, le forum,

Merci pour cette nouvelle étape. Dans l'exemple joint, ou 2 clubs se trouvent fatalement ensemble, ça ne fonctionne pas tout à fait.
Sinon, le code fonctionne pour 60 joueurs, mais le nombre peut varier de 10 à 60. Est-ce que le code peut permettre cet état ?
encore merci
 

Fichiers joints

david84

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

Bonjour,
j'ai failli t'oublier car tu ne passes pas souvent ! Il faudrait tout de même que tu sois plus présent pour faire vivre ton fil car sinon je risque de décrocher.
Merci pour cette nouvelle étape. Dans l'exemple joint, ou 2 clubs se trouvent fatalement ensemble, ça ne fonctionne pas tout à fait.
Je m'en était aperçu mais attendais ta réponse.
Ci-joint un nouvel essai à tester correctement de ton côté.
Sinon, le code fonctionne pour 60 joueurs, mais le nombre peut varier de 10 à 60. Est-ce que le code peut permettre cet état ?
Il sera temps de voir cela une fois que l'on est sûr que le code fonctionne bien, donc à toi de jouer en testant correctement ce code.
A+
 

Fichiers joints

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

bonjour David, Cisco, le forum,

Je suis bien présent, malheureusement, en ce moment, je traverse une période difficile. Le fait de venir ici, justement me fait oublier le reste.

J'ai bien testé ta nouvelle mouture et apparemment, c'est conforme à ma demande.
Je teste encore demain et te redis

merci
 

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

bonjour David, Cisco, le forum,

La méthode me parait judicieuse. Après d’autres essais, les changements sont optimisés par rapports aux contraintes. Difficile de faire mieux, bravo !
Ce serait bien de pouvoir tester avec un nombre de joueurs différent. J’espère ne pas trop compliquer car le nombre de combinaisons poules/joueurs peut être multiple.
Exemple pour 40 joueurs, plusieurs possibilités. Le fichier de Cisco traite cette étape -poste 77 - (Fichier joint dans liste et combinaisons). A moins que l’on puisse intégrer ton code avec les tableaux de Cisco.

Merci encore
 

Fichiers joints

david84

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

le nombre de combinaisons poules/joueurs peut être multiple.
Exemple pour 40 joueurs, plusieurs possibilités.
Sois plus précis s'il te plaît dans tes explications car je n'ai pas le temps de me replonger dans les fichiers antérieurs pour comprendre tes attentes.
Ci-joint un 1er essai : possibilité de choix du nombre de poules via le menu déroulant (entre 3 et 12 poules).
A toi de tester.
Ceci dit je te conseille de modifier la liste à repartir si tu veux tester sur un nombre de poule réduit car il me paraît difficile de tester correctement avec la liste actuelle.
A+
 

Fichiers joints

david84

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

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
Le fichier ne comporte aucune explication concernant un éventuel problème...comment veux-tu que je comprenne ce que tu veux ?
 

david84

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

Bonjour,
cf. fichier (certaines parties du code ont été modifiées).
à la place de Louis Tom Jonathan, je vois plus, Louis Jonathan Tom
Une fois encore sois précis : explique-moi pourquoi. Sur quoi est basé ton raisonnement ?

Personnellement je ne suis pas d'accord : voilà ce que dit le règlement :
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.
Dans le sens du serpent on traite d'abord Louis.
On en est à ce moment-là au traitement de la poule 5.
Comme il ne peut être placé en poule 5 ou 4 puisque ces poules comportent déjà un joueur issu de Beg il est placé en poule 3 (dans le sens du serpent qui sur cette ligne va de droite vers la gauche).

On se repositionne ensuite en poule 5 puisqu'elle est toujours vide (comme le stipule le règlement).
C'est ensuite au tour de Jonathan d'être placé : on le place en poule 5 puisque c'est possible.

On se positionne ensuite en poule 4 où l'on y place Tom.

Au final tu as donc de la gauche vers la droite (poule 3 à 5) Louis Tom Jonathan.
Qu'est ce qui pose problème ?
A+
 

Fichiers joints

Dernière édition:

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

bonjour David,

Je ne suis pas contre ton raisonnement, effectivement c'est bon comme tu as fait. Je partais du principe qu' un changement se faisait avec le joueur qui avait pris sa place. Louis a pris la place de Tom donc Tom reprend la place de Louis.
Mais on respecte bien le règlement, donc on ne change rien. Bien, 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.

Cas traité ci-joint. Autre remarque dans fichier à prendre en compte, si possibilité.
merci
 

Fichiers joints

david84

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

Bien, 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.
Si tu lis bien le règlement cette partie n'est pas traitée en
a) Changement de poule
mais en
b) Dans une même 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.
Autre remarque dans fichier à prendre en compte, si possibilité.
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.

D'autre part il faut voir si cela peut être traité par programmation et pour cela tu dois te poser la question de savoir :
- sur quelles les règles établies dans le règlement tu t'appuies pour gérer ce cas de figure
- si un algorithme peut être appliqué au traitement de ces règles.

Donc dans l'exemple que tu prends : à la 6ème rotation tu as effectivement 3 fois Beg et YYY mais tu ne peux les déplacer "au jugé" sinon autant le faire à la main.
Si tu veux que le code gère également ce cas tu dois me dire :
- où tu places YYY et pourquoi et par quoi tu le remplaces et pourquoi ?
- où tu places Beg et pourquoi et par quoi tu le remplaces et pourquoi ?
A+
 

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

Re,

Internet bug à fond, ici, coin perdu. J'ai compris les points du règlement, simplement il y a normalement liaison entre le placement et la définition des tours. Bien sûr, ce n'est pas trop le cas lorsque intervient des changements dans les poules. Je refais des essais concrets pour voir avec simulation des tours.
Je réfléchis à tout ça et te redis.
bon wkend
 

david84

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

J'ai compris les points du règlement, simplement il y a normalement liaison entre le placement et la définition des tours.
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.
Tiré du règlement p 17 :
™ 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
Concernant ton histoire de gestion des triplons dans la constitution des poules : un essai ci-joint à tester.
A+
 

Fichiers joints

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

bonjour, David, Cisco, le forum,

Après plusieurs essais, j'ai pu comparer avec l'existant. Le traitement des doublons est bien maitrisé. Je n'ai pas trouvé de situations litigieuses.
Quand aux triplons, je n'ai pas assimilé la méthode employée. En simulant avec les deux constructions, je n'ai pas trouvé d'interférences. Donc, je suis satisfait.
Autre demande dans fichier joint afin de finaliser cette étape.
merci
 

Fichiers joints

david84

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

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

quant à la demande énoncée dans le fichier explique-moi STP à quoi cela te servirait d'avoir le rang initial des joueurs à côté de leur nom ?
Si c'est pour préparer le tableau final cela ne te sert à rien : en repartant de l'exemple donné dans le règlement tu n'auras simplement qu'à associer -ex pour la poule 1- le nom du 1er de la poule en position 1 du tableau final, le 2ème en position 4 du tableau final, le 3ème en position 3 et le 4ème en position 2 (même principe pour les autres poules comme expliqué dans le règlement).

Outre le fait que cela complique la macro, cela ne sert donc à rien de ramener le rang initial puisque ce n'est pas lui mais le classement au sein de la poule qui conditionne le placement des joueurs dans le tableau final.
A+
 

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

Re,

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.

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

merci
 

Fichiers joints

Dernière édition:

david84

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

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

Je te laisse maintenant avancer de ton côté puisque la partie sur laquelle je suis intervenu (celle traitant de la constitution des poules à partir d'un classement initial) semble te convenir.

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.
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.
Ci-joint le code commenté pour que tu puisses en comprendre les grands principes.
C'est une version actualisée donc il remplace le précédent : à coller à la place de l'autre dans le module placé dans l'éditeur VBA (ALT+F11 pour y accéder à partir de la feuille de calcul) :
Code:
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
A+
 
Dernière édition:

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

bonjour David,

Merci encore d'avoir su trouver une méthode de construction dont les éléments de départ n'étaient pas tous bien cernés.
Cette étape est très importante et prenait du temps à la main.
bonne continuation
 

CISCO

XLDnaute Barbatruc
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

Bonjour à tous, bonjour Aredo, bonjour David84.

Je crois que je n'y serai pas arrivé avec des formules :) !

@ plus
 

aredo

XLDnaute Occasionnel
Re : Fonction Nb.si difficile à mettre en oeuvre (dans fichier tennis)

Bonjour Cisco, David,le forum,

Vous tous m'impressionnez un peu plus à chaque visite!
Juste une question bête, mais dans le fichier, quelle est le calcul qui donne l'affichage décimal en colonne C. Lors de tournois où il n'y a pas que des réservations, ce serai optimum si à chaque saisie de joueur, le tableau se mettait à jour automatiquement (tri décroissant par rapport à la colonne C).
merci

 
Dernière édition:

Haut Bas