Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Tirage au sort

gg13

XLDnaute Occasionnel
Bonjour,

Je reviens sur une macro de tirage au sort de la semaine dernière.
Après discussion et importante aide le résultat est sur le fichier joint.
Je voudrais ajouter une condition mais mes test ‘’buggent’’ tous.

Sur la liste des nombres en AA une ligne au hasard ne doit pas apparaitre
dans ce cas c’est AA10 soit la valeur de la cellule E4.

Mais pour le tirage au sort en BB c’est la même ligne qui doit être vide
soit la cellule BB10 or c’est la BB16 qui est vide.

Question : comment modifier la macro pour que seule BB10 soit vide
et le tirage au sort effectué dans les autres cellules.

Merci si vous connaissez la réponse.

GG13
 

Pièces jointes

  • TS1.xlsm
    82 KB · Affichages: 29

patricktoulon

XLDnaute Barbatruc
bonjour
je ne sais pas qui t'a donné ce code mais bon ca m'a donné un sacré mal de tete

donc pour que l'on soit sur
tu a une colonne "A" 20 valeurs
tu veux dans la colonne "B" les valeurs dans le désordre en exceptant la ligne qui est vide soit l'index en "E4"

ai-je bien compris le truc ?
 

gg13

XLDnaute Occasionnel
Merci
Ce code vient d'une discussion sur le site ,Je ne comprends pas tout mais
il fonctionne très bien.

tu a une colonne "A" 20 valeurs oui pour l'exemple mais il peut aller jusqu'à env 120 c'est pour ça qu'il est en variable en E2

tu veux dans la colonne "B" les valeurs dans le désordre en exceptant la ligne qui est vide soit l'index en "E4" exact la cellule vide en B doit être sur la même ligne que celle en A
gg13
 

Dranreb

XLDnaute Barbatruc
VB:
Option Explicit
Sub Tirage_sort2()
   Dim LMax As Long
   Randomize
   With New ListeAléat
      .Init Feuil2.[E2].Value
      .Supprimer Feuil2.[E4].Value
      LMax = Feuil2.[E1].Value
      If LMax > .Count Then LMax = .Count
      Feuil2.Columns("B").ClearContents
      Feuil2.[B1].Resize(LMax) = WorksheetFunction.Transpose(.Table)
      End With
   End Sub
Rappel: les méthodes de l'objet ListeAléat sont expliquées en détail dans son module de classe.
 

Pièces jointes

  • ListeAléatGg13.xlsm
    60.3 KB · Affichages: 18
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
d’après ce que j'ai compris de la demande
la colonne A dans le desordre (aléatoire ) avec exeption de la ligne 10 qui elle doit avoir
  1. soit d'office la valeur de E4
  2. soit VIDE
ce point n’étant pas vraiment explicite je t'ai mis les deux possibilités(voir dans la boucle elem dico )


j'ai ajouté aussi deux MFC
  1. une qui change la couleur de l'index en E4 sur la colonne b
  2. une autre qui met en couleur les cellules en B qui ont la même valeur en A

je ne me suis pas servi de nbrtir et max ligne je trouve que ce n'est pas cohérent avec l'intention
c'est inutile de faire les chose 36 fois rnd sur dico sait très bien faire tout seul
ça c'est le code qui remplace le tiens
VB:
Option Explicit
Sub test()
   Dim dico As Object, tabl, tabl2, x&, a&, elem
   Randomize
    Set dico = CreateObject("scripting.dictionary")
    With Sheets("Tirage_sort")
        tabl = .Range("A1", .Cells(Rows.Count, 1).End(xlUp)).Value
        ReDim tabl2(1 To UBound(tabl))

        Do While dico.Count < UBound(tabl) - 1
            x = Round(1 + (Rnd * (UBound(tabl) - 1)))
            If x = .[e4].Value Then x = x + 1
            dico(tabl(x, 1)) = ""
        Loop
       
         For Each elem In dico
            a = a + 1
            If a = .[e4].Value Then tabl2(a) = .[e4].Value: a = a + 1 'si tu veux la valeur de E4 dans l'index E4
            'ou
            'If a = .[e4].Value Then a = a + 1 'si tu veux laisser vide
                      tabl2(a) = elem
        Next
        .Cells(1, 2).Resize(UBound(tabl2)) = Application.Transpose(tabl2)
    End With
End Sub
je joins bien évidemment le fichier
 

Pièces jointes

  • TS1 V 2 patricktoulon .xlsm
    21.9 KB · Affichages: 6

gg13

XLDnaute Occasionnel
Pattictoulon
Merci pour la réponse et le travail.
Dans la colonne A le nb de valeurs reste à 20

En fait il peut y avoir par exemple 100 valeurs en A (donnée par E2) et le tirage se faire que sur les 20 premières valeurs(donnée par E1) et la ligne out sera une ligne quelconque
entre 1 et 20 ( donnée par E4 compris)
et les cellules A et B (donnée par E4) doivent être vides sur la même ligne
le tirage au sort sur la colonne B se fera donc sur les 19 valeurs restantes.

Après je dois faire 3 tirages identiques et sur chaque ligne dans la 4 colonnes chaque nb doit être différent.
pour éviter les doubles.

Sur le fichier joint si on utilise plusieurs fois le bouton la colonne A ne se rafraichis pas et le nombre
de valeurs est différent de celui demandé

GG13
 

gg13

XLDnaute Occasionnel
Danreb
Merci aussi pour ce boulot.
Il manque seulement l'affichage des valeurs de la colonne A y compris la ligne vide sur A et B (intercallée)
par contre les modules de classe il faudra que je les copies sans les comprendre trop ardus pour moi.

GG13
 

patricktoulon

XLDnaute Barbatruc
re
En fait il peut y avoir par exemple 100 valeurs en A (donnée par E2) et le tirage se faire que sur les 20 premières valeurs(donnée par E1)
heu.. oui ça me parait un peu contradictoire ou alors tu t'es mal exprimé
a moins que E1 = toujours E2

et la ligne out sera une ligne quelconque entre 1 et 20 ( donnée par E4 compris)
et les cellules A et B (donnée par E4) doivent être vides sur la même ligne
ça ok on comprend

le tirage au sort sur la colonne B se fera donc sur les 19 valeurs restantes.
ça c'est évident

je sais pas si tu te rends compte mais quand on lis ca
par bonté d’âme, je téléphonerais bien a ton boss pour lui demander de te donner quelques jours de repos
 

patricktoulon

XLDnaute Barbatruc
dans le doute ou Nb_tir(donc E1) serait la plage a prendre en compte pour 20 tirages y compris la ligne vide donné en E4
alors
VB:
Option Explicit
Sub test()
   Dim dico As Object, tabl, tabl2, x&, a&, elem
   Randomize
    Set dico = CreateObject("scripting.dictionary")
    With Sheets("Tirage_sort")
        tabl = .Range("A1").Resize(.[e1].Value)
        ReDim tabl2(1 To .[e2].Value)

        Do While dico.Count < .[e2].Value - 1
            x = Round(1 + (Rnd * (UBound(tabl) - 1)))
            If x = .[e4].Value Then x = x + 1
            dico(tabl(x, 1)) = ""
        Loop
        
        For Each elem In dico
            a = a + 1
           ' If a = .[e4].Value Then tabl2(a) = .[e4].Value: a = a + 1 'si tu veux la valeur de E4 dans l'index E4
            'ou
            If a = .[e4].Value Then a = a + 1 'si tu veux laisser vide
          
            tabl2(a) = elem
        Next
        .Cells(1, 2).Resize(UBound(tabl2)) = Application.Transpose(tabl2)
    End With
End Sub
démonstration avec 50 valeurs en "A" et 20 tirages + ligne vide
 

Dranreb

XLDnaute Barbatruc
Quel est donc le but de tout ça ?
Le numéro indiqué en E4 doit-il être tiré, oui ou non ?
Ou alors c'est plutôt le numéro en la position indiquée en E4 dans l'ordre aléatoire qui ne doit pas sortir ?
Ou bien il faut simplement sortir tout mais en intercalant une ligne vide à cette position ?
Mettez quelques exemples de ce que vous voulez au final.
Qu'est ce que l'utilisation de l'objet ListeAléat a d'ardu pour vous ?
Avez vous étudié les commentaires guide d'utilisation du module de classe ListeAléat ?
 
Dernière édition:

gg13

XLDnaute Occasionnel
Le numéro en E4 doit être exempt du tirage il ne doit pas apparaitre
désolé pour l'explication.J'essaye à nouveau en simplifiant.

Si 10 valeurs dans colonne A => 9 valeurs en colonne B ( mais ce nombre colonne A peut être quelconque)

Le nb 5 (out) ne doit pas apparaitre dans la colonne B.

la cellule B5 reste vide ou prends la valeur 0 (préférence)
et dans les 9 autres cellules B le tirage au sort se fait sur les 10 nombres moins le 5
soit 1 2 3 4 6 7 8 9 10
donc le 5 n'apparait pas dans le colonne B.
J'espère avoir été plus clair

1 6
2 7
3 10
4 1 Out 5
5
6 9
7 4
8 2
9 8
10 3


GG13
 

gg13

XLDnaute Occasionnel
Merci pour cette version.
il reste des lignes avec des doubles.
Pour cet exemple c'est le cas pour les lignes 2 et 19 ( chiffre out = 8)
Mais merci pour ton aide.
GG13


15Nombre de lignes maxi20
22Numéro maxi20
311
416Numéro non restitué8
57
618
720
912
1015
113
126
134
1413
1517
169
171
1814
1919
2010
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…