Aide macro tirage aléatoire triangulaire

haltero70

XLDnaute Nouveau
Bonjour,

J'ai besoin d'aide pour adapter un macro. Je n'ai trouvé la réponse nulle part et mes connaissances VBA sont limitées. J'ai trouvé une macro que j'ai modifier mais je n'arrive pas au résultat souhaité; je m'explique:
Le but est de faire un tirage au sort parmi plusieurs équipes (9/12/15 ou 18 par exemple) et de les répartir par 3 sur différentes journées (de 4 à 7 environ).
Jusque là ça marche, le problème:
conditions: - toutes les équipes doivent participer à toutes les journées.
- journée à 3 équipes obligatoire.
- toutes les équipes doivent se rencontrer au moins une fois (c'est là que je sèche :) )
Ma macro marche pour les journées (colonne) et les lignes (c'est cela que je doit modifier pour que tout le monde se rencontre mais impossible).

Est-ce mathématiquement possible en faisant varier le nombre d'équipe ou le nombre de journée?

Merci pour votre aide,
 

Pièces jointes

  • CHP 18 équipes.xlsm
    23.7 KB · Affichages: 30

Dranreb

XLDnaute Barbatruc
Bonsoir.
Juste une petite pièce qui pourrait vous servir:
VB:
Public Function NumVS(ByVal J As Long, ByVal A As Long) As Long
If J > A Then
   NumVS = J * (J - 3) \ 2 + A + 1
ElseIf J < A Then
   NumVS = A * (A - 3) \ 2 + J + 1
Else: NumVS = 0: End If
If NumVS <= 0 Then Err.Raise 9999, , "NumVS(" & J & ", " & A & ") impossible."
End Function
Elle renvoie un nombre unique en fonction de deux numéros J et A (comme Joueur et Adversaire) spécifiés dans n'importe quel ordre.
Elle pourrait vous donner une valeur d'indice vers un tableau d'une dimension As Boolean indiquant si deux numéros se sont déjà rencontrés.
La fonction inverse vous sera sans doute moins utile :
VB:
Public Function Versus(ByVal VS As Long) As Variant()
Dim J As Long, A As Long
A = Int(Sqr(2 * VS - 1.75) + 1.5)
J = VS - A * (A - 3) \ 2 - 1
Versus = Array(J, A)
End Function
 

haltero70

XLDnaute Nouveau
J'ai essayé en vain de créer un boucle tant que toutes les équipes ne se sont pas rencontrées mais la boucle tourne à l'infinie, j'ai peur que la solution ne soit pas possible. Avec des rencontres par 2, cette condition semble facile à mettre en place mais par 3 c'est vraiment une galère.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Pas pu me servir de l'ordi, depuis lundi.
Je ne procèderais pas ainsi, parce que le tirage aléatoire peut n'avoir laissé, pour les derniers matchs que des joueurs qui se sont déjà rencontrés. Je ferai plutôt une procédure déterminant un seul joueur, et qui s'appelle récursivement pour déterminer le suivant.
Il y a plein d'exemples dans le classeur joint.
 

Pièces jointes

  • ListeAléat.xlsm
    113.5 KB · Affichages: 38

Statistiques des forums

Discussions
311 721
Messages
2 081 928
Membres
101 842
dernier inscrit
seb0390