Attribution aléatoire Parrains/filleuls
Bonjour à tous,
Avant tout, merci à ceux qui vont me consacrer du temps afin de m'aider !
Je souhaiterais mettre en place quelque chose de relativement simple mais que je n'arrive pas à mettre en place car je ne trouve, sur les forums, que des sujets proches mais qui finissent par dériver de ma recherche.
Pour faire simple et rapide, mon objectif est d'attribuer à chaque nouvel étudiant d'une promotion (environ 950 étudiants que j'appellerais A1 pour simplifier) un parrain se trouvant deux années au dessus de lui (environ 250, car de nombreux sont en stage/échange académique, appelés A3). J'aimerais que ma formule puisse donc attribuer aléatoirement à chaque A1 un parrain A3, sachant que j'aimerais que les parrains aient entre 3 et 4 filleuls maximum chacun.
Merci beaucoup pour aide !
Perlimpinpin
Bonjour,
C'est fait !
Merci
Et voilà la suite :
Sub TirageParrains()
Dim tP, tF, tx$, txP$, txF$, k$, n%, i%, j%, f%, xF%, xP%
With ActiveSheet
n = .Cells(.Rows.Count, 2).End(xlUp).Row
tF = .Range("B4:B" & n).Value
n = .Cells(.Rows.Count, 5).End(xlUp).Row
tP = .Range("E4:E" & n).Value
End With
For i = 1 To UBound(tF)
txF = txF & ChrW(i + 32)
Next i
For i = 1 To UBound(tP)
txP = txP & ChrW(i + 32)
Next i
ReDim Tpa(1 To UBound(tF), 0)
n = Int(UBound(tF) / UBound(tP)) + 1: f = UBound(tF)
Randomize
For i = 1 To n
tx = txP: txP = ""
For j = 1 To UBound(tP)
xF = Int(Len(txF) * Rnd + 1)
k = Mid(txF, xF, 1): xF = AscW(k) - 32
txF = Replace(txF, k, "")
xP = Int(Len(tx) * Rnd + 1)
k = Mid(tx, xP, 1): xP = AscW(k) - 32
tx = Replace(tx, k, ""): txP = txP & k
tF(xF, 1) = tP(xP, 1): f = f - 1
If f = 0 Then Exit For
Next j
Next i
ActiveSheet.Range("C4").Resize(UBound(tF)).Value = tF
End SubPour tester, cliquer sur le bouton.
Merci beaucoup Mferrand, c'est exactement ça qu'il me fallait ! Je n'aurais jamais réussis seul.
J'ai une dernière question à te poser, quelles manipulations dois-je effectuer si je souhaite modifier le nombre de filleul et/ou parrains ?
Merci encore pour ton aide et pour ton temps !!
Pas de problème pour les variations de nombres, on les définit ici :
With ActiveSheet
n = .Cells(.Rows.Count, 2).End(xlUp).Row
tF = .Range("B4:B" & n).Value
n = .Cells(.Rows.Count, 5).End(xlUp).Row
tP = .Range("E4:E" & n).Value
End WithLe premier n cherche la dernière ligne de la colonne Filleuls, le second celle de la colonne Parrains.
Après le premier on affecte la plage Filleuls au tableau tF.
Et après le second on affecte la plage Parrains au tableau tP.
Les adaptations s'il y a lieu portent sur la colonne (B ou E dans les affectations, ou 2 ou 5 dans le calcul de n), et la première ligne (4).
On dispose du nombre de parrains avec UBound(tP) et de filleuls avec UBound(tF). [Les tableaux issus d'affectations de plages ont des indices qui commencent à 1.]
Si on se sert du tableau tP pour avoir les noms des parrains, on n'a pas besoin de tF pour les noms de filleuls. Mais tF nous fournit outre le nombre, un tableau prédimensionné : au fil des tirages, on remplace les noms de filleuls par le nom du parrain tiré. On disposera ainsi à la fin d'un tableau des Parrains de chaque filleul, qu'il suffira d'affecter.
ActiveSheet.Range("C4").Resize(UBound(tF)).Value = tFAdaptation éventuelle à faire semblable aux précédentes si C4 n'est plus le démarrage de la colonne des parrains attribués.
Sinon :
ReDim Tpa(1 To UBound(tF), 0)Cette ligne est à supprimer (oubli de ma part, option antérieure de constitution d'un tableau spécifique de résultats, rendu inutile par l'utilisation de tF à cette fin).
Pour le tirage, on calcule le ratio Filleuls/Parrains, arrondi à l'entier supérieur. Ce qui nous donne le nombre de tirages débutant avec une liste complète de parrains. La liste entière sera tirée pour chacun de ces lots de tirages, sauf le dernier qui sera interrompu lorsque la liste de filleuls sera épuisée. On assure ainsi l'équilibrage sans avoir à compter.
Un tirage élémentaire consiste à tirer un filleul, puis le parrain qu'on lui attribue.
Cordialement.
Merci beaucoup pour ces explications !
J'ai même vu qu'en étirant tout simplement la colonne parrain ou la colonne filleul (pour en augmenter ou diminuer le nombre car je ne connais pas encore le nombre exact de parrains et filleuls), la macro s'adapte parfaitement. Pas besoin de manipulation complexes ce qui est vraiment génial !
Encore mille mercis pour ton aide qui m'est très précieuse, tu as du passer du temps là dessus et je t'en suis très reconnaissant !
Passe une excellente soirée,
Cordialement,
Question d'habitude !
Mais si je dois passer plus de temps que prévu sur un sujet, c'est loin d'être négatif, c'est qu'il a fallu surmonter une difficulté non prévue au départ et cela fait toujours progresser. Ou le cas ne permet pas d'adapter simplement des solutions habituelles et il faut en charcher d'autres...
Bonne continuation.