Bonsoir, Salut à tous !
Il faut d'abord savoir que le type de ta question (grouper des participants et faire tourner pour que chacun puisse être associé à tous les autres dans un groupe), sous son aspect simpliste demeure un problème mathématique complexe à résoudre, que selon le nombre de participants et de groupes il est loin d'y avoir toujours une solution.
Divers mathématiciens renommés ont traités des morceaux de la question de façon à définir les cas possibles ou non, et établir des méthodes pour les différents cas.
Je ne prétendrais pas traiter mathématiquement la question, mais la configuration 49 en 7 groupes, d'une part permet une répartition de tous : 7*7=49, et d'autre part permet à chacun d'être associé à chacun des autres à chaque tour : 48 autres participants, 6 autres que lui par groupe, 6*8=48, donc 8 tours doivent permettre ces associations...
Par ailleurs les combinaisons de 7 éléments parmi 49 représentent 85 900 584 combinaisons. Les associations recherchées 7 tables en 8 tours utiliseront 56 combinaisons compatibles. Si l'on répartit l'ensemble des combinaisons en groupes de 56 compatibles (je pense que c'est possible, mais je ne m'amuserai pas à chercher à le faire), on pourrait épuiser l'ensemble des possibilités de regroupement en 1 533 939 fois 8 tours...
Dans la pratique il est donc tout à fait préférable de s'en tenir à un système de regroupement utilisant 56 combinaisons compatibles à prédéfinir.
Si on part des combinaisons d'un tour :
chaque colonne représentant une table.
En gardant la 1re ligne fixe, et en décalant chaque autre ligne de 1 pour la 2e, 2 pour la 3e, ...6 pour la 7e, et en répétant 6 fois cette opération, on obtiendra 7 tours où chacun est associé à chaque fois à des participants différents. Le 8e tour pour boucler n'est que la transposition du diagramme initial qui associe les membres de chaque lignes qui n'ont pu l'être au cours des décalages précédents.
On peut donc construire cette configuration qui constituera un tableau de paramètres pour la répartition. Une procédure pour construire ce tableau :
Sub Paramètres()
Dim i%, ln%, tr%, Tbl(62, 6)
For tr = 0 To 6
For ln = 0 To 6
For i = 0 To 6
Tbl(ln + tr * 8, i) = (i + ln + ln * tr) Mod 7 + ln * 7 + 1
Next i
Next ln
Next tr
For ln = 0 To 6
For i = 0 To 6
Tbl(ln + 56, i) = ln + i * 7 + 1
Next i
Next ln
ActiveSheet.Range("B2").Resize(63, 7).Value = Tbl
End Sub
Cette procédure fixe donc sur une plage de la feuille sur laquelle on l'exécute un tableau de 63 lignes sur 7 colonnes, composée de blocs de 7 lignes sur 7 colonnes, et une ligne vide séparant chaque bloc (au cas particulier sur la plage B2:H64).
A noter que si l'on remplace les numéros 1 à 49 par des noms de participants, on a là les 7 tables sur 8 tours. A noter aussi que si la procédure permet de reconstruire ce tableau de base, on n'a normalement besoin de le constituer qu'une fois. Une fois fait, il demeure...
L'établissement de ce schéma de répartition en groupes, répondant aux critères, ne fait appel à aucun tirage aléatoire, celui-ci intervient par l'affectation à chaque participant d'un numéro de 1 à 49 tiré aléatoirement, sans doublon.
Plaçons donc sur un autre feuille, d'abord la liste des participants, disons sur la plage B2:B50 (on réserve la colonne A, que l'on pourra masquer, pour y placer les numéros tirés).
Préparons un tableau de répartition : F3:L9 (7 lignes sur 7 colonnes) sera le 1er tour, F11:L17 sera le 2e tour... on va ainsi jusqu'à F59:L65 pour le 8e tour. On notera que le tableau global F3:L65 est de taille égale au tableau de paramètres constitué précédemment (63 lignes sur 7 colonnes) et que chaque emplacement dévolu à un participant correspond à un numéro dudit tableau.
On peut donc placer une formule tout à fait simple sur le tableau que nous venons de définir, en F3 :
=SIERREUR(RECHERCHEV(Param!B2;$A$2:$B$50;2;FAUX);"")
Cette formule, utilise le numéro figurant sur le même emplacement du tableau paramètre pour le rechercher en A et renvoyer le nom de la même ligne en B (liste des participants).
On copie donc cette formule sur tout le tableau F3:L65 (à l'exclusion des lignes de séparation), et dès lors qu'on aura affecté une liste de numéros tirés en A2:A50, le tableau sera entièrement servi.
Dans ces conditions la procédure de tirage se simplifie :
Sub Tirage()
Dim Tbl(1 To 49, 0), tx$, k$, i%, x%
For i = 1 To 49
tx = tx & Chr(i + 32)
Next i
Randomize
For i = 1 To 49
x = Int(Len(tx) * Rnd + 1)
k = Mid(tx, x, 1)
Tbl(i, 0) = Asc(k) - 32
tx = Replace(tx, k, "")
Next i
ActiveSheet.Range("A2:A50").Value = Tbl
End Sub
Un clic sur un bouton Tirage, la procédure affecte une liste de numéros 1 à 49 sans doublon en A2:A50, et la formule (unique) répercute les noms dans le tableau de répartition de 7 tables de 7 en 8 tours. Système simple, avec un code réduit et une seule formule élémentaire...
Cordialement.