Tirage sans remise problème VBA

Bonjour à tous,

Ayant commencé l'apprentissage du VBA il y a peu, je peine encore à faire un tirage aléatoire sans problème

Je m'explique :

Dans le fichier ci-dessous se trouve ma macro VBA censée simuler un tirage de quelques numéros sans qu'il y ai de doublons et que le tirage se fasse dans l'ordre. Le premier numéro a 1 chance sur 30, le second 1 chance 29 etc.... puisque je souhaite prendre en compte les numéros tirés précédemment sans passer par la facilité de dire "pour pas que ce soit le même alors ce sera le même + 1". Je cherche à faire en sorte qu'un nombre soit donc tiré au hasard sur la totalité en excluant les précédents. Je ne sais pas si je suis clair après 6h de triturage de cerveaux !

ps : Autre problème --> je ne sais pas pourquoi mais parfois certains nombre ne s'affichent pas... sont-ils tirés ?

Auriez vous une idée de ce que dois modifier pour que ma macro fonctionne s'il vous plaît ?

Merci

24tirage.xlsm (18.59 Ko)

Bonjour

c'est normal que parfois un nombre ne s'affiche pas

en cas de retirage tu n’écrit pas (par exemple ici en D10) derrière

boule3 = Int(30 * Rnd) + 1
If boule3 <> boule1 And boule2 Then
Range("D10") = boule3
Else: boule3 = Int(30 * Rnd) + 1
End If

voir macro modifié en PJ

A plus sur le forum

12tirage.xlsm (18.13 Ko)

Merci Papyg !

J'ai bien rectifier et le problème du non affichage est résolu ! Toutefois il m'arrive encore d'avoir des doublons alors que j'exclus toutes les boules sorties...

Je n'ai malheureusement pas pu tester votre fichier car excel me dit que la macro n'est pas présente .

Sub TIRAGE()

Dim boule1 As Integer
Dim boule2 As Integer
Dim boule3 As Integer
Dim boule4 As Integer
Dim boule5 As Integer

Randomize

Range("B10:F10").Clear

boule1 = Int(30 * Rnd) + 1
If boule1 <> boule2 And boule3 And boule4 And boule5 Then
Range("B10") = boule1
Else: boule1 = Int(30 * Rnd) + 1
Range("B10") = boule1
End If

boule2 = Int(30 * Rnd) + 1
If boule2 <> boule1 And boule3 And boule4 And boule5 Then
Range("C10") = boule2
Else: boule2 = Int(30 * Rnd) + 1
Range("C10") = boule2
End If

boule3 = Int(30 * Rnd) + 1
If boule3 <> boule1 And boule2 And boule4 And boule5 Then
Range("D10") = boule3
Else: boule3 = Int(30 * Rnd) + 1
Range("D10") = boule3
End If

boule4 = Int(30 * Rnd) + 1
If boule4 <> boule1 And boule2 And boule3 And boule5 Then
Range("E10") = boule4
Else: boule4 = Int(30 * Rnd) + 1
Range("E10") = boule4
End If

boule5 = Int(30 * Rnd) + 1
If boule5 <> boule1 And boule2 And boule3 And boule4 Then
Range("F10") = boule5
Else: boule5 = Int(30 * Rnd) + 1
Range("F10") = boule5
End If

End Sub

re

si tu veux tester tu copie à la place de ton code

mais c'est sensiblement pareil

Option Explicit
Sub AlŽatoire()

Dim boule1 As Integer
Dim boule2 As Integer
Dim boule3 As Integer
Dim boule4 As Integer
Dim boule5 As Integer

Randomize

Range("B10:F10").Clear
boule1 = Int(30 * Rnd) + 1
Range("B10") = boule1
boule2 = Int(30 * Rnd) + 1
While boule2 = boule1
     boule2 = Int(30 * Rnd) + 1
Wend
Range("C10") = boule2

boule3 = Int(30 * Rnd) + 1
While boule3 = boule1 Or boule3 = boule2
    boule3 = Int(30 * Rnd) + 1
Wend
Range("D10") = boule3

boule4 = Int(30 * Rnd) + 1
While boule4 = boule1 Or boule4 = boule2 Or boule4 = boule3
    boule4 = Int(30 * Rnd) + 1
Wend
Range("E10") = boule4

boule5 = Int(30 * Rnd) + 1
While boule5 = boule1 Or boule5 = boule2 Or boule5 = boule3 Or boule5 = boule4
Range("F10") = boule5
     boule5 = Int(30 * Rnd) + 1
     Wend
Range("F10") = boule5

End Sub

A plus sur le forum

Bonjour,

procède autrement.

Crée toi un tableau avec tes 30 nombres que tu mélanges.

1 boucle qui parcours ton tableau et qui échange avec un autre pris au hasard

Plus qu'à les prendre tels qu'ils se présentent.

eric

Ça marche merci ! Après un grand nombre d'essai avec le code de Papyg il n'y a plus aucun doublon ! Je vais quand même essayer avec votre code aussi pour le fun

re

en fait la seule différence d'avec ta macro c'est que tu testais une seule fois

si il y avait un doublon tu refaisait un tirage mais ce second tirage était pris en compte sans être re testé

la boucle avec while fait que tant qu'il y a une différence on tire et on teste

A plus sur le forum

Rechercher des sujets similaires à "tirage remise probleme vba"