Tirage aleatoire sans doublon avec plusieurs boutons

Mr Guizz

XLDnaute Junior
Salut a tous ,
j'ai creer un tableur excel avec 8 boutons qui, grace a des macros, affiche un chiffre entre 1 et 8 quand on appuie sur les differents boutons. Le probleme est que j'aimerai que les 8 chiffres soient tous differents!

Que dois je rajouter dans mon code pour que lorsque j'appuie sur les 8 differents boutons cela me sorte 8 differents! ( je veux garder les 8 boutons et pas en avoir qu'un seul !!)

Voici le code que je repetez 8 fois pour chaque boutons

Private Sub CommandButton1_Click()
'Initialiser le générateur de nombres aléatoires
'=> Randomize : à ajouter avant d'utiliser Rnd pour obtenir des valeurs complètement aléatoires
Randomize

'Nombre aléatoire entier entre 1 et 8 :
nombre_aleatoire = Int(8 * Rnd) + 1
Range("f6").Value = nombre_aleatoire
End Sub

Merci !!
 

Pièces jointes

  • alea_sans_doublon.xlsm
    35.4 KB · Affichages: 47

Mr Guizz

XLDnaute Junior
Re salut Dranreb
En partant sur le meme principe mais avec UN SEUL BOUTON , est t'il possible d'avoir un bouton qui, lorsque l'on appuie dessus genere un chiffre en f6 (toujours de 1 a 8), puis lorsque l'on appuie dessus genere un chiffre en f7 (toujours de 1 a 8) et differement du precedent, puis lorsque l'on appuie dessus genere un chiffre en f8 (toujours de 1 a 8) et differement des precedent, puis etc .....

Merci
 

Dranreb

XLDnaute Barbatruc
Oui, c'est possible.
Mais vous me feriez plaisir d'essayer de l'écrire vous même.
Parce que ça dépend si le classeur est fermé par exemple après avoir choisi 5 numéro, les suivants l'étant un autre jour, auquel cas c'est plus compliqué que si tout est toujours fait au cours d'une même période de quelques minutes. Dans ce dernier cas il suffit de définir un ListeAléat global, l'initialiser quand on veut le 1er numéro, puis d'épuiser simplement cet objet au fur et à mesure.
Sinon on peut par exemple encore mettre tout en une fois dans les cellules mais avec un format de nombre ";;;" puis découvrir à chaque clic sur le bouton en y mettant un autre le 1er qui porte ce format.
Mais on peut aussi écrire tout simplement un truc très voisin de ce que je vous ai déjà écrit.
Peut être même très légèrement plus simple. (Edit: après essai, non, pas plus simple mais extrêmement ressemblant !)
Il y a des commentaires guides d'utilisation dans le module de classe ListeAléat.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonsour®
@ Dranreb.... je vais essayer d'ecrire ca ...
Pour plus d'explication, le tirage des 8 chiffres ce fait le meme jour ( dans les meme 10 secondes d'ailleurs !)

Merci quand meme pour votre taf !
Un peu tard :(,
:rolleyes: Alors pour le fun :
upload_2016-9-8_1-12-13.png
 

Pièces jointes

  • tirage-8.xlsm
    28.1 KB · Affichages: 46

Dranreb

XLDnaute Barbatruc
Bonjour
Êtes vous quand même arrivé à retoucher ma version pour qu'elle fonctionne avec un seul bouton ?
Solution la plus proche de la 1ère :
VB:
Private Sub CommandButton9_Click()
Dim Plg As Range, T(), L As Long, Numéros As New ListeAléat
Set Plg = Me.[F6:F13]
T = Plg.Value
Randomize
Numéros.Init UBound(T, 1)
For L = 1 To UBound(T, 1)
  If T(L, 1) < 1 Or T(L, 1) > UBound(T, 1) Then Exit For
  Numéros.Supprimer T(L, 1): Next L
If Numéros.Count > 0 Then
  Plg.Rows(L).Value = Numéros.Aléat
Else
  MsgBox "Il ne subsiste plus d'autre numéro disponible.", _
  vbCritical, "Générer": End If
End Sub
Mais on peut en écrire une qui ne fait qu'un seul ListeAléat.Init lors de la sortie du 1er numéro et en ressort ensuite simplement les positions P suivantes ListeAléat.Aléat(P). Il faut alors qu'il soit global, bien sûr. P aussi d'ailleurs.
VB:
Option Explicit
Private P As Long, Numéros As ListeAléat
Private Sub CommandButton10_Click()
P = P Mod 8 + 1
If P = 1 Then
  Set Numéros = New ListeAléat
  Randomize
  Numéros.Init 8
  [F6:F13].Value = Empty
  End If
Cells(5 + P, "F").Value = Numéros.Aléat(P)
End Sub
Là ça devient si simple qu'on peut aussi se passer du module de classe ListeAléat et utiliser un petit tableau à la place qu'on initialise de la même façon que dans la méthode Init de l'objet ListeAléat (sans RectifierPositions puisqu'on n'a jamais besoin de connaitre la position d'un numéro).
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 098
Messages
2 116 191
Membres
112 679
dernier inscrit
Yupanki