Private Sub CommandButton1_Click()
Top5
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [A:A]) Is Nothing Then Top5
End Sub
Sub Top5()
Dim t, d As Object, i&, x, a, b
t = Range("A2", Range("A" & Rows.Count).End(xlUp)(3)) 'au moins 2 éléments
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(t)
x = t(i, 1)
If x <> "" Then d(x) = d(x) + 1
Next
If d.Count Then
'---tri VBA---
a = d.keys: b = d.items
Call tri(a, b, 0, UBound(a))
'---restitution---
For i = 0 To IIf(UBound(a) < 4, UBound(a), 4)
[D2].Offset(i) = a(i): [E2].Offset(i) = b(i)
Next
End If
If d.Count < 5 Then Range("D" & d.Count + 2 & ":E6").ClearContents
End Sub
Sub tri(a, b, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = b((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While b(g) > ref: g = g + 1: Loop
Do While ref > b(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
temp = b(g): b(g) = b(d): b(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub