Sub tirageAlea()
Dim nbrLot&, derlig&, nbrTicket&, rep
Application.ScreenUpdating = False ' pas d'actualisation de l'affichage (plus rapide)
rep = Application.CountA(Range("d3:e3").Resize(Rows.Count - 2)) ' nombre de valeurs dans le tirage déjà affiché
If rep > 0 Then ' si un tirage semble exister
rep = MsgBox("Il est possible qu'un tirage existe déjà." & vbLf & _
"Voulez-vous le supprimer et procéder à un nouveau tirage ?", vbQuestion + vbYesNo + vbDefaultButton2) ' on demande de confirmer le tirage
If rep <> vbYes Then MsgBox "Abondon du tirage", vbInformation: Exit Sub ' si refus d'un nouveau tirage, on arrête la macro
End If
Sheets("ListTicket").Select ' sélection de la feuille "ListTicket"
Range("d3:e" & Rows.Count).ClearContents ' effacement du précédent tirage
nbrLot = CLng(Val(InputBox("Nombre de lot pour cette année ?" & vbLf & "( >0 ou sinon on quitte l'exécution) :"))) ' demande du nombre de lots
If nbrLot <= 0 Then MsgBox "Aucun lot ! Arrêt de l'exécution.", vbCritical: Exit Sub ' si le nombre de lot n'est pas supérieur à 0 alors on arrête la macro
Range("a1").Resize(Rows.Count).RemoveDuplicates , Header:=xlYes ' par précaution, on supprime les tickets en doublons
nbrTicket = Cells(Rows.Count, "a").End(xlUp).Row - 1 ' le nombre de tickets
If derlig = 1 Then MsgBox "Aucun ticket => on quitte l'exécution", vbCritical: Exit Sub ' si aucun ticket alors on arrête la macro
If nbrLot > nbrTicket Then nbrLot = nbrTicket ' on ramène le nombre de lots au nombre de tickets (si plus de lots que de tickets)
Range("a2").Resize(nbrTicket).Copy Range("e3") ' on recopie la liste des tickets en colonne E
Range("d3").Resize(nbrTicket).Formula = "=RAND()" ' on met des nombres aléatoires dans la colonne D via une formule
Range("d3:e3").Resize(nbrTicket).Sort key1:=Range("d3"), Header:=xlNo ' on trie les colonnes D à E en fonction de la colonne E
Range("d3").Resize(nbrLot).Formula = "=ROW()-2" ' dans la colonne D, on met une formule pour mettre les valeurs 1, 2, 3, ...
Range("d3").Resize(nbrLot) = Range("d3").Resize(nbrLot).Value ' on convertit les formules en leur valeur
Range(Cells(nbrLot + 3, "d"), Cells(Rows.Count, "e")).ClearContents ' on efface les lignes sous le dernier lot
End Sub