Sub TirageLoto()
Dim TableauAleatoire(1 To 49)
Dim i As Integer, j As Integer, Lig As Integer
Dim Doublon As Boolean, OK As Boolean, Fin As Boolean, Fin1Ligne As Boolean
Dim Note As Integer
Dim NbEssais As Integer
Const MAX_ESSAI = 2000
Application.ScreenUpdating = False
Range("TableauTirage").ClearContents
NbEssais = 1
Fin = False
While Not Fin
'à chaque essai :
' - on va faire un tirage ligne par ligne et non pour tout le tableau
' - si la ligne ne respecte pas les règles, on boucle sur la ligne
' - sinon on passe à la suivante
' - si tout est ok, c'est fini
' - pour la dernière ligne, on n'a pas le choix autre que l'ordre du tirage, donc 1 seul essai
' - si tout n'est pas ok, on repart du début jusqu'à atteindre le max d'essai
Lig = 1
Fin1Ligne = False
While Not Fin1Ligne
Randomize
' on remplit le tableau pour la ligne courante
For i = (Lig * 5) - 4 To Application.Min(Lig * 5, UBound(TableauAleatoire))
OK = False
While Not OK
TableauAleatoire(i) = Int((UBound(TableauAleatoire)) * Rnd + 1)
Doublon = False
For j = 1 To i - 1
If TableauAleatoire(j) = TableauAleatoire(i) Then Doublon = True
Next j
If Not Doublon Then OK = True
Wend
Next i
j = 0
For i = (Lig * 5) - 4 To Application.Min(Lig * 5, UBound(TableauAleatoire))
j = j + 1
Range("TableauTirage").Cells(Lig, j) = TableauAleatoire(i)
Next i
Note = Range("NOTE")
If Note = 0 Then
If Lig = 10 Then
' c'est fini OK
Fin1Ligne = True
Fin = True
MsgBox "Tirage OK en " & NbEssais & " essais.", vbExclamation, "Tirage Loto"
Else
' on passe à la ligne suivante
Lig = Lig + 1
NbEssais = NbEssais + 1
End If
Else
If Lig = 10 Then
' sur la dernière ligne, on ne peut rien améliorer -> on recommnce
Fin1Ligne = True
Range("TableauTirage").ClearContents
Erase TableauAleatoire
Else
NbEssais = NbEssais + 1
If NbEssais >= MAX_ESSAI Then
Fin1Ligne = True
Fin = True
If Lig = 10 Then
MsgBox "Tirage KO après " & NbEssais & " essais.", vbCritical, "Tirage Loto"
Else
MsgBox "Tirage très KO après " & NbEssais & " essais.", vbCritical, "Tirage Loto"
End If
End If
End If
End If
Wend
Wend
End Sub