XL 2019 Concours/Formules pour affecter un terrain dans le tour suivant selon le résultat

berru76

XLDnaute Occasionnel
Bonjour

Si des pros des formules ont une solution a mon problème un grand Merci a vous


Dans le fichier ci-joint je recherche

Feuille Terrains G P

Formule pour affecter le terrain (F4-F33) dans le tour suivant (k4-K33) selon le résultat G/P

Feuille Terrains 13<13

Formule pour affecter le terrain (AH4-AH33) dans le tour suivant (AP4-AP33) selon le résultat 13<13

Merci de votre aide
 

Pièces jointes

  • Terrains G P ou 13 3 .xlsm
    159 KB · Affichages: 8

crocrocro

XLDnaute Occasionnel
Bonjour le fil, bonjour @berru76,
@berru76, il faudrait pour vous proposer une formule, que vous indiquiez la règle permettent de déterminer le terrain où doit se dérouler la rencontre.
Dans votre tableau, par exemple les équipes 7 et 22 ont gagné au tour précédent, ce n'est donc pas le critère de choix du terrain. Est-ce le terrain de l'équipe de la ligne du haut ? ici donc T1 ?
 

crocrocro

XLDnaute Occasionnel
Une suggestion :
Ne pas attribuer le terrain par formule directement dans les cellules car toute modification dans les matchs du 1er tour, par exemple suite à une erreur, recalculerait l'attribution des terrains et si on a déjà indiqué à des équipes le terrain du 2ème tour, cela peut poser problème.
Faire une attribution des terrains par macro avec pour règle complémentaire de n'attribuer un terrain que si il n'a pas déjà été attribué. Ce qui permet d'effectuer des attributions au fil de l'eau, en conservant donc les terrains attribués précédemment. Pour remettre en jeu les terrains du 2ème tour attribués à tort, il suffit de les remettre à blanc avant de lancer la macro.
EDIT : Pour éviter que les équipes qui gagnent, rejouent systématiquement sur le même terrain, tirage aléatoire des terrains libres lors de l'attribution.
 
Dernière édition:

berru76

XLDnaute Occasionnel
Bonsoir
Excuser moi pour le retard de réponse Aujourd'hui concours dont je m'occupe
Je suis intéressé a toute suggestion en pensant qu'il a quatre tour dans le concours
une macro serait Ideal
je vous joint un modèle avec les 4 tourS
Merci de votre aide
 

Pièces jointes

  • Terrains 4 tours.xlsm
    39.9 KB · Affichages: 1

crocrocro

XLDnaute Occasionnel
Bonsoir,
pas vu votre fichier
la macro correspondant à ma suggestion précédente pour le 2ème tour de la feuille Terrains GP de votre 1er fichier.
J'ai supprimé la ligne du milieu du tableau "2ème tour" (colonne K à O). la dernière ligne 2ème tour est au même niveau que celle du 1er tour.
J'ai remplacé le ? par vide en colonne K (vide = terrain non attribué).


VB:
Sub AttribuerTerrains2èmeTour()
Const PREMLIG = 4
Const COLJOUE = 10  ' colonne J (Match gagné ou perdu joueur 2 1er Tour)
Const COLTOUR2 = 11 ' colonne K (n° terrain 2ème Tour)
Dim i As Integer, j As Integer, k As Integer
Dim DerLig As Long, Derlig2 As Long
Dim TabTerrain()
Dim NoTerrain As String
Dim TabNo()
Dim alea
Dim Fin As Boolean, Trouve As Boolean

    DerLig = ActiveSheet.Cells(Rows.Count, COLJOUE).End(xlUp).Row
    Derlig2 = ActiveSheet.Cells(Rows.Count, COLTOUR2).End(xlUp).Row
    ReDim TabTerrain(1 To DerLig - PREMLIG + 1)
    For i = PREMLIG To DerLig
        If Not IsEmpty(Cells(i, COLJOUE)) Then
            'match joué
            NoTerrain = Range("F" & i)
            ' on regarde si le terrain n'est pas déjà attribué pour le 2ème tour
            Trouve = False
            For k = PREMLIG To Derlig2
                If ActiveSheet.Cells(k, COLTOUR2) = NoTerrain Then
                    Trouve = True
                    Exit For
                End If
            Next k
            If Not Trouve Then
                j = j + 1
                TabTerrain(j) = NoTerrain
            End If
        End If
    Next i
    If j = 0 Then
        ' terrains tous affectés
        MsgBox "Aucun Terrain nouvellement attribué"
        Exit Sub
    End If
    ReDim Preserve TabTerrain(1 To j)
    
    ReDim TabNo(1 To UBound(TabTerrain))
    k = 0
    For i = LBound(TabTerrain) To UBound(TabTerrain)
        If Not IsEmpty(TabTerrain(i)) Then
            Fin = False
            While Not Fin
                Randomize
                alea = WorksheetFunction.RandBetween(1, UBound(TabTerrain))
                Trouve = False
                For j = 1 To k
                    If TabNo(j) = alea Then
                        Trouve = True
                        Exit For
                    End If
                Next j
                If Not Trouve Then
                    k = k + 1
                    TabNo(k) = alea
                    Fin = True
                End If
            Wend
        End If
    Next
    
    'on affecte le tableau du 2ème groupe
    i = 0
    For k = PREMLIG To DerLig
        If ActiveSheet.Cells(k, COLTOUR2) = "" And Not IsEmpty(Cells(k, COLJOUE)) Then
            i = i + 1
            ActiveSheet.Cells(k, COLTOUR2) = TabTerrain(TabNo(i))
        End If
    Next k
    MsgBox "Les Terrains libres sont réaffectés pour le 2ème Tour"

End Sub
 

berru76

XLDnaute Occasionnel
Bonjour
Je viens de tester la macro pour le 2° tour elle fonctionne mais ne prend pas en compte la séparation du tableau du 2° tour et est décalé a partir de k28
comme dans l'exemple en fichier joint
le problème est que les gagnants et perdants sont placé automatiquement dans les tours suivants par formule je ne peut donc pas décaler les cellules (90 pages)
si vous avez la solution
et voir pour les macros du 3°4° tour

Un grand merci
 

Pièces jointes

  • Terrains AVEC 4 tours.xlsm
    50 KB · Affichages: 2
Dernière édition:

crocrocro

XLDnaute Occasionnel
Bonjour le fil
@berru76 , c'était bien dans ma remarque post 6.
Ces lignes intermédiaires qui "polluent" la macro sont-elles nécessaires ?
En figeant les volets avec la 2ème ligne incluse quand on fait défiler, on visualise le n° du tour, donc est-ce bien utile ?
EDIT : il faudrait une règle claire qui permettent de ne pas la confondre avec une ligne joueur (par exemple :
Autre question : Quelle règle pour attribuer les terrains libres au 2ème tour ?
Dans ma macro actuelle, je l'ai fait ligne à ligne indépendamment du fait que les 2 joueurs du 2ème tour de la ligne aient joué (et gagné) leur 1er tour. Je pense que ce n'est pas bon, il faut que les 2 joueurs aient gagné, n'est-ce pas ?
Macro actuelle et 1ère page après attribution 2ème tour
EDIT 2 : Macro nouvelle version
VB:
Option Explicit
Sub AttribuerTerrains2èmeTour(pNoTour As Integer)
Const PREMLIG = 4
Dim ColTour As Integer  ' colonne F (pour 1er Tour)
Dim ColJoue As Integer  ' colonne J (Match gagné ou perdu joueur 2 1er Tour)
Dim ColJoueSuiv  As Integer ' colonne L (Match gagné ou perdu joueur 1 2ème Tour)
Dim ColTourSuiv  As Integer ' colonne K (n° terrain 2ème Tour)
Dim i As Integer, j As Integer, k As Integer
Dim DerLig As Long, Derlig2 As Long
Dim TabTerrain()
Dim NoTerrain As String
Dim TabNo()
Dim alea
Dim Fin As Boolean, Trouve As Boolean

    ColTour = 6 + 5 * (pNoTour - 2)
    ColJoue = 10 + 5 * (pNoTour - 2)
    ColJoueSuiv = 12 + 5 * (pNoTour - 2)
    ColTourSuiv = 11 + 5 * (pNoTour - 2)

    DerLig = ActiveSheet.Cells(Rows.Count, ColJoue).End(xlUp).Row
    Derlig2 = ActiveSheet.Cells(Rows.Count, ColJoueSuiv).End(xlUp).Row
    ReDim TabTerrain(1 To DerLig - PREMLIG + 1)
    For i = PREMLIG To DerLig
        If Not IsEmpty(Cells(i, ColJoue)) Then
            'match joué
            NoTerrain = Cells(i, ColTour)
            ' on regarde si le terrain n'est pas déjà attribué pour le 2ème tour
            Trouve = False
            For k = PREMLIG To Derlig2
                If ActiveSheet.Cells(k, ColTourSuiv) = NoTerrain Then
                    Trouve = True
                    Exit For
                End If
            Next k
            If Not Trouve Then
                j = j + 1
                TabTerrain(j) = NoTerrain
            End If
        End If
    Next i
    If j = 0 Then
        ' terrains tous affectés
        MsgBox "Aucun Terrain nouvellement attribué"
        Exit Sub
    End If
    ReDim Preserve TabTerrain(1 To j)
    
    ReDim TabNo(1 To UBound(TabTerrain))
    k = 0
    For i = LBound(TabTerrain) To UBound(TabTerrain)
        If Not IsEmpty(TabTerrain(i)) Then
            Fin = False
            While Not Fin
                Randomize
                alea = WorksheetFunction.RandBetween(1, UBound(TabTerrain))
                Trouve = False
                For j = 1 To k
                    If TabNo(j) = alea Then
                        Trouve = True
                        Exit For
                    End If
                Next j
                If Not Trouve Then
                    k = k + 1
                    TabNo(k) = alea
                    Fin = True
                End If
            Wend
        End If
    Next
    
    'on affecte le tableau du 2ème groupe
    i = 0
    For k = PREMLIG To Derlig2
        If ActiveSheet.Cells(k, ColTourSuiv) = "" And Not IsEmpty(Cells(k, ColJoue)) Then
            i = i + 1
            ActiveSheet.Cells(k, ColTourSuiv) = TabTerrain(TabNo(i))
        End If
    Next k
    MsgBox "Les Terrains libres sont réaffectés pour le 2ème Tour"

End Sub

1731236531931.png
1731237365195.png
 
Dernière édition:

crocrocro

XLDnaute Occasionnel
La dernière version de la macro qui prend en compte
- la présence de lignes intermédiaire comm "2ème tour" (colonne K à O)
- la règle supposée correcte : Attribution du terrain seuelemnt si les 2 joueurs ont gagné le 1er tour
VB:
Option Explicit
Sub AttribuerTerrains2èmeTour(pNoTour As Integer)
Const PREMLIG = 4
Dim ColTour As Integer  ' colonne F (pour 1er Tour)
Dim ColJoue As Integer  ' colonne J (Match gagné ou perdu joueur 2 1er Tour)
Dim ColJoueSuiv  As Integer ' colonne L (Match gagné ou perdu joueur 1 2ème Tour)
Dim ColTourSuiv  As Integer ' colonne K (n° terrain 2ème Tour)
Dim i As Integer, j As Integer, k As Integer
Dim DerLig As Long, Derlig2 As Long
Dim TabTerrain()
Dim NoTerrain As String
Dim TabNo()
Dim alea
Dim Fin As Boolean, Trouve As Boolean

    ColTour = 6 + 5 * (pNoTour - 2)
    ColJoue = 10 + 5 * (pNoTour - 2)
    ColJoueSuiv = 12 + 5 * (pNoTour - 2)
    ColTourSuiv = 11 + 5 * (pNoTour - 2)

    DerLig = ActiveSheet.Cells(Rows.Count, ColJoue).End(xlUp).Row
    Derlig2 = ActiveSheet.Cells(Rows.Count, ColJoueSuiv).End(xlUp).Row
    ReDim TabTerrain(1 To DerLig - PREMLIG + 1)
    For i = PREMLIG To DerLig
        If Not IsEmpty(Cells(i, ColJoue)) Then
            'match joué
            NoTerrain = Cells(i, ColTour)
            ' on regarde si le terrain n'est pas déjà attribué pour le 2ème tour
            Trouve = False
            For k = PREMLIG To Derlig2
                If ActiveSheet.Cells(k, ColTourSuiv) = NoTerrain Then
                    Trouve = True
                    Exit For
                End If
            Next k
            If Not Trouve Then
                j = j + 1
                TabTerrain(j) = NoTerrain
            End If
        End If
    Next i
    If j = 0 Then
        ' terrains tous affectés
        MsgBox "Aucun Terrain nouvellement attribué"
        Exit Sub
    End If
    ReDim Preserve TabTerrain(1 To j)
   
    ReDim TabNo(1 To UBound(TabTerrain))
    k = 0
    For i = LBound(TabTerrain) To UBound(TabTerrain)
        If Not IsEmpty(TabTerrain(i)) Then
            Fin = False
            While Not Fin
                Randomize
                alea = WorksheetFunction.RandBetween(1, UBound(TabTerrain))
                Trouve = False
                For j = 1 To k
                    If TabNo(j) = alea Then
                        Trouve = True
                        Exit For
                    End If
                Next j
                If Not Trouve Then
                    k = k + 1
                    TabNo(k) = alea
                    Fin = True
                End If
            Wend
        End If
    Next
   
    'on affecte le tableau du 2ème groupe
    i = 0
    For k = PREMLIG To Derlig2
        'If ActiveSheet.Cells(k, ColTourSuiv) = "" And Not IsEmpty(Cells(k, ColJoue)) Then
        If ActiveSheet.Cells(k, ColTourSuiv) = "" And Cells(k, ColJoueSuiv) <> 0 And Cells(k, ColJoueSuiv).Offset(0, 2) <> 0 Then
            i = i + 1
            ActiveSheet.Cells(k, ColTourSuiv) = TabTerrain(TabNo(i))
        End If
    Next k
    MsgBox "Les Terrains libres sont réaffectés pour le " & pNoTour & "ème Tour"

End Sub

3 boutons à créer pour activer la macro avec le bon paramètre

1731239985771.png

le code de la feuille est le suivant
Code:
Private Sub BoutonTerrain2_Click()
    AttribuerTerrains2èmeTour 2
End Sub

Private Sub BoutonTerrain3_Click()
    AttribuerTerrains2èmeTour 3
End Sub

Private Sub BoutonTerrain4_Click()
    AttribuerTerrains2èmeTour 4
End Sub
 

crocrocro

XLDnaute Occasionnel
Dernière version en pj.
Elle prend en compte
- la présence de lignes intermédiaires (comme "2ème tour" colonne K à O)
- la règle : Attribution du terrain seulement si les 2 joueurs ont gagné le tour précédent
Dans le fichier, j'ai fait un test jusqu'au 4ème tour où il n'y a pas de terrain à attribuer du fait de la règle précédente.
La macro envoie un message de compte-rendu spécifique à chaque cas.
Les terrains réaffectés sont sur fond bleu (pas de remise à aucun remplissage à chaque exécution -> à faire manuellement)
 

Pièces jointes

  • Terrains 4 tourscrocrocro2.xlsm
    59.2 KB · Affichages: 2
Dernière édition:

berru76

XLDnaute Occasionnel
Bonjour
j'ai testé sur plusieurs feuilles et j'ai un problème au niveau de l'indice comme dans l'exemple ci joint
Si je lance la macro du 4 ° tour cela m'annonce une erreur d'indice et me place des numéros de terrains en face d'équipes ayant un X
je n'avait pas pensé au X
si vous avez une idée car sur mes 90 feuilles j'ai beaucoup de X
Un grand Merci
 

Pièces jointes

  • Essai Terrains 4 tourscrocrocro2.xlsm
    61 KB · Affichages: 1

crocrocro

XLDnaute Occasionnel
Bonsoir,
voici la ligne de code qui permet de ne pas prendre en compte les X ou x pour valeur de l'équipe 1 ou 2 (remplacer la ligne de code par celle-ci)
VB:
        If ActiveSheet.Cells(k, ColTourSuiv) = "" And Cells(k, ColJoueSuiv) <> 0 And Cells(k, ColJoueSuiv).Offset(0, 2) <> 0 And UCase(Cells(k, ColJoueSuiv)) <> "X" And UCase(Cells(k, ColJoueSuiv).Offset(0, 2)) <> "X" Then
A noter que si ce n'est pas un X mais un ou plusieurs espaces ou un x suivi ou précédé d'un espace ... il y aura le même problème

EDIT
Il est préférable d'utiliser cette ligne de code qui élimine les valeurs non numériques (il faut donc que les n° d'équipe le soient)

VB:
        If ActiveSheet.Cells(k, ColTourSuiv) = "" And Cells(k, ColJoueSuiv) <> 0 And Cells(k, ColJoueSuiv).Offset(0, 2) <> 0 And IsNumeric(Cells(k, ColJoueSuiv)) And IsNumeric(Cells(k, ColJoueSuiv).Offset(0, 2)) Then
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 626
Messages
2 111 280
Membres
111 090
dernier inscrit
ISSAKA