Sub TiragesAléatoires()
Dim n&, derlig&, P As Range, t, ncol%, d As Object, i&, ni&, j%
n = 300 '1000 'nombre de lignes à retenir, à adapter
n = n + 1 'en ajoutant la ligne de titres
Application.ScreenUpdating = False
ActiveSheet.Copy 'document auxiliaire
With ActiveSheet
derlig = .Cells.Find("*", , xlValues, , xlByRows, xlPrevious).Row
Set P = Intersect(.UsedRange, .Rows("4:" & derlig))
End With
With P.Columns(P.Columns.Count + 1) 'colonne auxiliaire à droite
.Formula = "=RAND()"
.Value = .Value 'supprime les formules
.Cells(1) = 0
Union(P, .Cells).Sort .Cells, xlAscending 'tri
.EntireColumn.Delete 'suppression de la colonne auxiliaire
End With
'---élimination des doublons---
t = P 'tableau VBA (matrice)
ncol = UBound(t, 2)
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(t)
If Not d.exists(t(i, 11)) Then
d(t(i, 11)) = ""
ni = ni + 1
For j = 1 To ncol
t(ni, j) = t(i, j)
Next
If ni = n Then Exit For
End If
Next
'---restitution---
With Feuil2 'CodeName de la feuille de restitution
.Rows("4:" & .Rows.Count).Delete 'RAZ
P.Rows("1:2").EntireRow.Copy .[A4] 'pour les formats
If ni > 1 Then .Rows(5).AutoFill .Rows(5).Resize(ni - 1), xlFillFormats
.[A4].Resize(ni, ncol) = t
.Columns.AutoFit 'ajustement de la largeur des colonnes
.Activate
End With
P.Parent.Parent.Close False 'fermeture du document auxiliaire
End Sub