Microsoft 365 Tirage/mélange aléatoire

Pehache

XLDnaute Nouveau
Bonjour,

Veuillez m'excusez d'abord si ma demande se trouvait être la énième mais après mainte recherche je n'ai pas trouvés quelque chose qui correspondait à ma recherche ou même qui aurait pu s'y adapté et si c'est le cas, veuillez me le pardonner.

Chose simple (ou peut être pas..) : Je cherche à tirer/mélanger mes cellules ( en jaune dans le documents joint) pour qu'elle se retrouve aléatoirement dans le tableau de la feuille suivante. Sans doublons. Je pars pour le moment sur le principe ou il y a des espaces entre chaque lignes de données entrantes et qu'elle ne doivent pas être prisent en compte. Ce sera quelque chose à adapté si ma demande s'avérerait provenir de mars.

Merci d'avance pour votre aide.
 

Pièces jointes

  • Classeur1.xlsx
    13.6 KB · Affichages: 7
Dernière édition:

Pehache

XLDnaute Nouveau
Bonjour Pehache, et bienvenu sur XLD,
Un exemple en PJ avec une petite macro.
Bonjour et merci pour l'accueil !

Et bin c'est parfait !
Merci de m'avoir maché le travail car ca ne ressemble à rien de ce que j'ai pu voir et creuser pour avoir ce resultat. Puis je te demander ce qui définit les cellules sources et celles qui "réceptionnent" ? histoire de comprendre le principe et pouvoir l'intégrer à des docs. Je devrais pouvoir ensuite réussir à l'adapter par exemple en intégrant une ligne de 4 de + sur la feuille 1 pour obtenir des poules de 5.

Merci

Edit: enfaite une explication global du code me serait utile bien que j'ai déja les 3 grosses lignes de principe. Car pour un essai de ce que je cite un peu au dessus, Cad de rajouter une ligne, j'obtiens une erreur de macro . Surprenant 😆
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Une PJ un peu modifiée.
Le nombre d'éléments n'a pas d'importance, le nombre de lignes vides non plus.
( i faut cependant que la colonne A et la Ligne 3 contiennent des éléments )
Et j'ai commenté la macro pour plus de compréhension.
 

Pièces jointes

  • Classeur1 V2.xlsm
    23.4 KB · Affichages: 3

Pehache

XLDnaute Nouveau
C'était l'hypothèse.
Pour éviter que refaire le travail une troisième fois soit la dernière, soyez sympa et donnez un fichier vraiment représentatif avec les bonnes explications.
Car là ça revient à dire, j'ai des données quelque part débrouillez vous.
Ci joint ma base.
Le même principe qu'auparavant mais les données prises en compte entre B15 et E15 et donnant la possibilité d'ajouter des lignes qui donneront donc une ligne supplémentaire à la seconde feuille (poule de 5 , 6 , 7 etc)

Mes excuses. En procédant avec un fichier test, je souhaitais juste comprendre le fonctionnement et être capable de l'adapter suivant le cas ayant plusieurs format de tableau (6 poules).
 

Pièces jointes

  • TirPoules.xlsx
    19 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
Il n'y a pourtant pas plus simple que d'utiliser un objet ListeAléat.
Si, il est peut être plus simple d'utiliser les fonction perso ListeAl et Hasard.
Il y a même des exemples de tirages par poules simultanées et successives. Que vous faut-il de plus ?
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonsoir
comme je le dis toujours la meilleure facon (et la plus simple et même la plus sure) de faire du tirage au hasard sans doublons c'est de prendre un array tel quel et de le mélanger au hasard
VB:
Sub test()
    Dim t(), i&, a&, c&, cel As Range
    
   'on rapatri toutes les cellules jaune de la feuil1 dans un array
   With Feuil1
        For i = 3 To 12
            For c = 1 To 4
                If .Cells(i, c) <> "" Then a = a + 1: ReDim Preserve t(1 To a): t(a) = .Cells(i, c)
            Next
        Next
    End With
    
    'on mélange cet array
    For i = 1 To UBound(t):  x = 1 + (Int(Rnd * (UBound(t) - 1))):  tp = t(i): t(i) = t(x): t(x) = tp: Next
    
    a = 0
    'on repose les valeur de l'array dans la plage  de la feuil2
    With Feuil2
        For Each cel In .[A2:D5].Cells: a = a + 1: cel.Value = t(a): Next
    End With
End Sub
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Pehache, Dranreb, Patrick,
En PJ un troisième et dernier essai.
La feuille poules est remise à jour en fonction du nombre de joueurs.
Si la dernière poule n'est pas complète ( nombre de joueurs non multiple de 4 ) elle est ignorée.

NB: Je n'ai pas compris votre "Nombre d'équipes", c'est plutôt le nombre de joueurs.
Le nombre d'équipes serait plutôt : =ENT(NBVAL(B15:E100)/4)
 

Pièces jointes

  • TirPoules (V3).xlsm
    27 KB · Affichages: 5

Pehache

XLDnaute Nouveau
Bonsoir Pehache, Dranreb, Patrick,
En PJ un troisième et dernier essai.
La feuille poules est remise à jour en fonction du nombre de joueurs.
Si la dernière poule n'est pas complète ( nombre de joueurs non multiple de 4 ) elle est ignorée.

NB: Je n'ai pas compris votre "Nombre d'équipes", c'est plutôt le nombre de joueurs.
Le nombre d'équipes serait plutôt : =ENT(NBVAL(B15:E100)/4)

Bonsoir a tous,

C'est parfait Sylvanu, juste que l'objectif était que l'ajout d'une ligne de participants doit être réparti sur les 4 poules et non que cela créer une poule supplémentaire.
navré de ne pas avoir été clair sur ce point si c'était le cas.

Merci pour la base fournie.

EDIT: Avec les fichiers test en amont, j'ai réussi a obtenir ce que je voulais. Je n'arrive pas en revanche a éviter la création d'une colonne alors que c'est une ligne qui s'ajoute.
 
Dernière édition:

Pehache

XLDnaute Nouveau
bonsoir
comme je le dis toujours la meilleure facon (et la plus simple et même la plus sure) de faire du tirage au hasard sans doublons c'est de prendre un array tel quel et de le mélanger au hasard
VB:
Sub test()
    Dim t(), i&, a&, c&, cel As Range
    
   'on rapatri toutes les cellules jaune de la feuil1 dans un array
   With Feuil1
        For i = 3 To 12
            For c = 1 To 4
                If .Cells(i, c) <> "" Then a = a + 1: ReDim Preserve t(1 To a): t(a) = .Cells(i, c)
            Next
        Next
    End With
    
    'on mélange cet array
    For i = 1 To UBound(t):  x = 1 + (Int(Rnd * (UBound(t) - 1))):  tp = t(i): t(i) = t(x): t(x) = tp: Next
    
    a = 0
    'on repose les valeur de l'array dans la plage  de la feuil2
    With Feuil2
        For Each cel In .[A2:D5].Cells: a = a + 1: cel.Value = t(a): Next
    End With
End Sub

Merci pour cette piste. j'explorerai cette technique !
 

Discussions similaires

Réponses
10
Affichages
799
Réponses
4
Affichages
1 K

Statistiques des forums

Discussions
314 499
Messages
2 110 247
Membres
110 711
dernier inscrit
chmessi