Répartition aléatoire Equilibrée d'une liste
Bonjour,
voici ma problématique générale :
J'ai une liste de participants (300) ainsi qu'une liste de groupes (10).
Je souhaite répartir aléatoirement ces participants dans les groupes, de manière équilibrée. Soit 10 groupes de 30 personnes.
Ci dessous le fichier sur lequel je travaille.
J'ai déjà pas mal avancé, mais je ne trouve pas comment limiter mes groupes à 30 personnes.
Je vous remercie par avance pour votre aide
Benoit.
Bonjour,
Ouille !
Il s'agit de répartir aléatoirement 300 personnes en 10 groupes ?
Si tu indiques à quel emplacement tu veux lister les groupes, on pourra faire ça sans contorsions inutiles (et à 30 par groupe !)
Cordialement.
Bonjour,
tous les chemins mènent au rhum. Hip!
eric
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonjour à tous,
Ci-joint une proposition en VBA, à tester !
10 groupes de 30 personnes, restitution dans l'onglet "Résultat"
Bonne journée
Bouben
MFerrand a écrit :Bonjour,
Ouille !
Excuse-moi mais je n'ai pas pu lire jusqu'au bout... ! Il s'agit de répartir aléatoirement 300 personnes en 10 groupes ?
Si tu indiques à quel emplacement tu veux lister les groupes, on pourra faire ça sans contorsions inutiles (et à 30 par groupe !)
Cordialement.
"Pas pu lire jusqu'au bout" ... pourquoi donc ?
Je pensais que mon fichier était clair. Si ce n'est pas le cas, merci de me dire en quoi je peux le rendre plus clair
Devant chaque participant, il faudrait le nom du groupe auquel il est attribué.
eriiic a écrit :Bonjour,
tous les chemins mènent au rhum. Hip!
eric
Pas compris
bouben a écrit :Bonjour à tous,
Ci-joint une proposition en VBA, à tester !
10 groupes de 30 personnes, restitution dans l'onglet "Résultat"
Bonne journée
Bouben
Merci !
Ca semble faire le job sans doublons. Super 8)
Je vais décortiquer tout ça et l'adapter à ma feuille.
Bonne journée.
Benoit.
Pas compris
C'était pour dire que j'étais en accord avec MFerrand, tu n'as pas pris le chemin le plus court pour ton code.
Tous les chemins mènent à Rome si tu préfères.
Re,
Voilà une méthode, qui se limite à faire ce que tu demandais, soit lister les groupes en regard des noms des participants, mais on pourrait en l'aménageant lui faire lister les participants de chaque groupe...
Là, elle a le mérite d'être peu gourmande en volume de code et d'être immédiatement adaptable à un autre nombre de groupe et/ou de participants, en fournissant toujours une répartition équilibrée, et égale dès lors que le nombre de participants est un multiple du nombre de groupes.
Private Sub cbAffecter_Click()
Dim Tgr(), tx$, k$, ng%, np%, i%, j%, x%, Ptcp As Range
Set Ptcp = Me.Range("A15:A" & Me.Cells(Rows.Count, 1).End(xlUp).Row)
np = Ptcp.Rows.Count: ng = 10
For i = 1 To np
tx = tx & ChrW(i + 32)
Next i
ReDim Tgr(1 To np, 0)
Randomize
For i = 1 To np
x = Int(Len(tx) * Rnd + 1)
k = Mid(tx, x, 1): x = AscW(k) - 32
j = j Mod 10 + 1
Tgr(x, 0) = "Groupe" & j
tx = Replace(tx, k, "")
Next i
Ptcp.Offset(, 1).Value = Tgr
End SubCommentaires (que je ne mets jamais en principe dans le code, ça me gêne pour la lecture...
Variables déclarées : un tableau pour recueillir résultat (laissé Variant par habitude, mais qui ici pourrait être typé String), 2 variables String (dont on verra l'usage ci-après), 2 variables Integer pour y consigner nb de groupes et nb de participants, 3 autres variables Integer (une qui sera exclusivement utilisée comme compteur de boucle, une autre pour incrémenter le groupe qu'on affectera par tirage, la 3e utilisée pour le tirage proprement dit), enfin une variable Range (qu'on initialisera avec la plage de participants).
A noter que le besoin d'une variable Worksheet ne fait pas sentir (on ne travaille que sur une feuille...), et encore moins dans la mesure où l'on code dans le module de la feuille concernée, où la feuille elle-même peut toujours être visée par Me !
On initialise donc Ptcp avec la plage participants, pas de difficulté, et on définit np (nombre de participants = nb de lignes de la plage) et ng (nb de groupes, en dur, mais on pourrait aussi bien le prélever sur la feuille...)
On initialise tx comme chaîne comportant autant de caractères différents que de participants (en éliminant les 32 premiers caractères, spéciaux + espace).
Là je fais de la propagande pour la méthode String-Galopin [
On dimensionne notre tableau résultats sur une colonne avec autant de lignes que de participants.
Il ne reste plus qu'à tirer : on initialise le générateur de nombres aléatoires (Randomize).
Le principe du tirage : on fait autant de tirages que de participants, d'où une boucle de 1 à np (nb de participants). On tire un nombre parmi les nombre 1 au nombre de caractères contenus dans la chaîne tx (300 au départ, 1 au dernier tour de boucle car on en retire un à chaque tour).
x le nombre tiré, on extrait le caractère de rang x de la chaîne, on convertit le caractère en rang du participant qu'il représente (réutilisation de x...). On incrémente en j le numéro du groupe affecté (j étant à 0 au départ passera à 1 au premier tour et quand il aura atteint 10, repassera à 1 au tour suivant...). Et on affecte ce groupe à l'élément du tableau résultat (rang correspondant à celui du participant tiré).
On élimine le caractère tiré de la chaîne avant de poursuivre.
A la fin, notre tableau est rempli et il n'y a plus qu'à l'affecter à la colonne voisine de celle des participants...
On pourrait bien sûr complexifier l'opération : par exemple mélanger la chaîne initiale avant de procéder au tirage (soit faire un premier tirage pour constituer une autre chaîne sur laquelle on tirera), opérer un tirage du groupe à retenir à chaque fois (en veillant à l'alternance pour assurer l'équilibrage), etc. Ce système simple fournit une méthode adaptable à de nombreux cas...
Cordialement.
MFerrand a écrit :Re,
Voilà une méthode, qui se limite à faire ce que tu demandais, soit lister les groupes en regard des noms des participants, mais on pourrait en l'aménageant lui faire lister les participants de chaque groupe...
Là, elle a le mérite d'être peu gourmande en volume de code et d'être immédiatement adaptable à un autre nombre de groupe et/ou de participants, en fournissant toujours une répartition équilibrée, et égale dès lors que le nombre de participants est un multiple du nombre de groupes.
Cordialement.
Au top !
Simple et efficace.
M-E-R-C-I !!!