Voilà une proposition de code:
il ne reste plus qu'à associer la macro "Main" à ton bouton
Function tire_au_sort(ByVal x As Long, ByVal y As Long) As Long
'cette fonction renvoie un entier compris entre x et y inclus de façon aléatoire
'L'instruction randomize permet de réinitialiser la série de nombres aléatoires
'sinon on aurait tout le temps la même série
Randomize
tire_au_sort = Int(Rnd() * (y + 1 - x) + x)
End Function
Sub main()
Dim x, y, z As Long
Dim u, i As Integer
' on met la première borne en "E3" et la deuxième en "F3"
x = Cells(3, 5)
y = Cells(3, 6)
' on va placer les résultats successifs du tirage dans la colonne H, mis bout-à-bout
's'il y a déjà y-x+1 valeurs dans la colonne H (par ex 10 valeurs si on tire entre 1 et 10), c'est qu'on a fait toutes les combinaisons
If WorksheetFunction.CountA(Columns(8)) > y - x Then
If MsgBox("Vous avez parcouru toutes les combinaisons, Recommencer ?", vbYesNo) = vbYes Then
'si la réponse est oui, on efface le contenu de la colonne H et on met le premier tirage en H1
Columns(8).Cells.ClearContents
Cells(1, 8) = tire_au_sort(x, y)
Cells(6, 5) = Cells(1, 8)
Exit Sub
Else
'sinon on sort
Exit Sub
End If
End If
u = WorksheetFunction.CountA(Columns(8))
Do
'on effectue un tirage en faisant appel à notre fonction
z = tire_au_sort(x, y)
' on recherche ensuite si ce résultat est déjà contenu dans la plage des résultats précédents
' il y a toutes sortes de moyen d'optimiser cette recherche, mais on ne le fait pas là (flemme)
For i = 1 To u
If z = Cells(i, 8) Then Exit For 'dès qu'on trouve une concordance, on sort de la boucle
Next i
'Si on sort de la boucle que l'on n'a pas parcouru toute la plage, c'est que le résultat a déjà été tiré
' on aurait pu aussi écrire Loop while not(i=u+1)
Loop While i <= u
'une fois qu'on a trouvé un Z non déjà tiré, on l'écrit en bas de la liste et aussi dans la case "E6"
Cells(u + 1, 8) = z
Cells(6, 5) = z
End Sub