1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| Private Sub UserForm_Initialize()
Dim MonDico As Object
Dim c As Range
Dim Temp() As String, TabVal() As String, TabRw() As Long
Dim i As Integer
With Me.ComboBox1
.ColumnCount = 2
.ColumnWidths = .Width - 2 & ";0"
End With
With Sheets("B")
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In .Range("M2", .Cells(Rows.Count, 13).End(xlUp))
If Not MonDico.exists(c.Value) And c.Value <> "" Then
i = i + 1
MonDico(c.Value) = c.Value
ReDim Preserve TabVal(1 To i)
TabVal(i) = c.Value
ReDim Preserve TabRw(1 To i)
TabRw(i) = c.Row
End If
Next c
ReDim Temp(1 To 2, 1 To MonDico.Count)
For i = 1 To MonDico.Count
Temp(1, i) = TabVal(i)
Temp(2, i) = TabRw(i)
Next i
Tri Temp(), 1, UBound(Temp, 2)
End With
Me.ComboBox1.List = Application.Transpose(Temp())
End Sub
'QuickSort tableau à 2 dimensions
Public Sub Tri(Tablo() As String, ByVal Deb As Long, ByVal Fin As Long)
Dim Moy As String, Mx As String, Mn As String
Dim i As Long, Rw As Long
If Deb >= Fin Then Exit Sub
i = Int((Fin - Deb + 1) * Rnd + Deb)
Moy = Tablo(1, i)
Rw = Tablo(2, i)
Tablo(1, i) = Tablo(1, Deb)
Tablo(2, i) = Tablo(2, Deb)
Mn = Deb: Mx = Fin
Do
Do While Tablo(1, Mx) >= Moy
Mx = Mx - 1
If Mx <= Mn Then Exit Do
Loop
If Mx <= Mn Then
Tablo(1, Mn) = Moy
Tablo(2, Mn) = Rw
Exit Do
End If
Tablo(1, Mn) = Tablo(1, Mx)
Tablo(2, Mn) = Tablo(2, Mx)
Mn = Mn + 1
Do While Tablo(1, Mn) < Moy
Mn = Mn + 1
If Mn >= Mx Then Exit Do
Loop
If Mn >= Mx Then
Mn = Mx
Tablo(1, Mx) = Moy
Tablo(2, Mx) = Rw
Exit Do
End If
Tablo(1, Mx) = Tablo(1, Mn)
Tablo(2, Mx) = Tablo(2, Mn)
Loop
Tri Tablo(), Deb, Mn - 1
Tri Tablo(), Mn + 1, Fin
End Sub |
Partager