Procédure :
Sub Tirage7()
Dim d As Object, k, chk$, n%, i%, c As Range
Set d = CreateObject("Scripting.Dictionary")
With Worksheets("Feuil1")
For i = 1 To 20
If .Cells(i, 3) <> "" Then
n = n + 1
Else
Exit For
End If
Next i
If n = 0 Then Exit Sub
For Each c In .Range("C1:V" & n)
k = ChrW(c.Value + 32): d(k) = ""
Next c
For Each k In d.keys
chk = chk & k
Next k
k = "": Randomize
For i = 1 To Len(chk)
n = Int(Len(chk) * Rnd + 1)
k = k & Mid(chk, n, 1)
chk = Replace(chk, Mid(chk, n, 1), "")
Next i
For i = 1 To 7
n = Int(Len(k) * Rnd + 1)
chk = chk & Mid(k, n, 1)
k = Replace(k, Mid(k, n, 1), "")
Next i
k = ""
For i = 1 To 7
k = k & ";" & AscW(Mid(chk, i, 1)) - 32
Next i
k = Split(k, ";")
For i = 1 To 6
For n = i + 1 To 7
If CInt(k(n)) < CInt(k(i)) Then
k(0) = k(n): k(n) = k(i): k(i) = k(0)
End If
Next n
Next i
n = 1
For i = 1 To 20
If .Range("AK" & i) <> "" Then
n = i + 1
Else
Exit For
End If
Next i
If n > 20 Then
MsgBox "Le tableau de tirage des grilles est plein.", vbInformation, "Tableau plein"
Exit Sub
End If
With .Range("AK" & n)
For i = 1 To 7
.Cells(1, i) = CInt(k(i))
Next i
End With
End With
End Sub
Tu la traouveras dans Module1. Elle est affectée au bouton prévu.
Méthode utilisée :
- Délimitation de la plage utilisée dans C1:V20
- Parcours de cette plage pour prélever les numéros sans doublons (utilisation Dictionary à cette fin)
- les numéros sont transformés en caractères texte en partant du caractère 33 (pour éliminer les caractères de contrôles et l'espace), il y a correspondance de chaque numéro avec un caractère
- L'ensemble des caractères correspondant aux numéros est rassemblé en une chaîne texte unique
- Après initialisation du générateur de nombres aléatoires, un premier tirage est effectué sur cette chaîne : on tire à chaque fois un caractère, on le transfère dans une autre chaîne, on le retire de la première avant de procéder au tirage suivant (cette méthode élimine d'emblée toute possibilité de doublon, ce premier tirage équivaut à mélanger les numéros prélevés dans la plage avant de passer au tirage final des numéros à retenir pour la grille)
- On enchaîne avec un tirage de 7 caractères destinés à composer la grille (extraits de la chaîne mélangée...)
- cette chaîne finale tirée donne lieu à reconversion des caractères en numéros entre lesquels on intercale un séparateur, ce qui permet d'obtenir un tableau des numéros tirés
- Ce tableau de numéros est trié dans l'ordre croissant
- On recherche alors la ligne sur laquelle doit être inscrite la ligne de numéros tirés (si le tableau est plein, cela est signalé et la proc. s'interrompt)
- Les numéros tirés sont affectés sur la première ligne disponible du tableau des grilles...
Cordialement.