[COLOR="DarkSlateGray"][B]Private Sub Organiser_Click()
Dim adr1$, adr2$
Dim i&, j&, k&, l&, m&, n&, tmp As Variant
Dim collC As New Collection, sDat, oDat, lDat&, cDat&
[COLOR="SeaGreen"]'
'Paramètres de la zone de données :[/COLOR]
adr1 = "A2:C": adr2 = "B2" '***
[COLOR="SeaGreen"] '[/COLOR]
oDat = Range(adr1 & Range(adr2).End(xlDown).Row).Value
lDat = UBound(oDat, 1)
cDat = UBound(oDat, 2) + 2
ReDim Preserve oDat(1 To lDat, 1 To cDat)
Randomize
For k = 1 To lDat: oDat(k, cDat) = Rnd: Next k
For i = 1 To lDat
For j = i To lDat
If oDat(j, cDat) < oDat(i, cDat) Then
For k = 1 To cDat: tmp = oDat(j, k): oDat(j, k) = oDat(i, k): oDat(i, k) = tmp: Next k
End If
Next j
Next i
cDat = cDat - 1
ReDim Preserve oDat(1 To lDat, 1 To cDat)
For k = 1 To lDat
Set collC = Nothing
On Error Resume Next
For i = 1 To lDat
If IsEmpty(oDat(i, cDat)) Then collC.Add oDat(i, 2), oDat(i, 2)
Next i
On Error GoTo 0
If collC.Count = 0 Then Exit For
ReDim sDat(1 To collC.Count, 1 To 2)
For i = 1 To collC.Count
sDat(i, 1) = collC.Item(i)
For j = 1 To lDat
sDat(i, 2) = sDat(i, 2) + (oDat(j, 2) = sDat(i, 1)) * IsEmpty(oDat(j, cDat))
Next j
Next i
For i = 1 To collC.Count
For j = i To collC.Count
If sDat(j, 2) > sDat(i, 2) Then
For l = 1 To 2: tmp = sDat(j, l): sDat(j, l) = sDat(i, l): sDat(i, l) = tmp: Next l
End If
Next j
Next i
For l = 1 To WorksheetFunction.Min(4, collC.Count)
For n = 1 To lDat
If (oDat(n, 2) = sDat(l, 1)) * IsEmpty(oDat(n, cDat)) Then m = m + 1: oDat(n, cDat) = m: Exit For
Next n
Next l
Next k
For i = 1 To lDat
For j = i To lDat
If oDat(j, cDat) < oDat(i, cDat) Then
For k = 1 To cDat: tmp = oDat(j, k): oDat(j, k) = oDat(i, k): oDat(i, k) = tmp: Next k
End If
Next j
Next i
Range(adr1 & Range(adr2).End(xlDown).Row).Value = oDat
End Sub[/B][/COLOR]