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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| Option Explicit
'-------------------------------------------------------------------------------
Public Sub Classer()
'-------------------------------------------------------------------------------
Dim TabDonnées() As Variant
Dim Classement() As Long
Dim Tableau As Range
Dim i As Long, x As Integer, y As Long
' Mémorise les données du tableau (y compris l'entête) en base 1
' Ici la cellule haut gauche du tableau est en C10, le plus propre est de nommer cette
' cellule est d'utiliser le nom:
Set Tableau = [C10].CurrentRegion.Cells
' Redimensionne la mémoire qui contiendra les données (sans l'entête) en base 0:
ReDim Mémo(0 To UBound(Tableau()) - 2, 0 To Tableau.Count / UBound(Tableau()))
' Mémorise les données en base 0 sans l'entête:
For i = 2 To UBound(Tableau())
For x = 1 To Tableau.Count / UBound(Tableau())
Mémo(i - 2, x - 1) = Tableau(i, x)
Next x
Next i
' Redimensionne la mémoire qui contiendra la clé de tri en base 0:
ReDim TabDonnées(0 To UBound(Mémo()))
' Génère une clé stockée dans TabDonnées en base 0.
' Ici c'est la 1ère lettre de la 1ère colonne + la 1ère lettre de la 2ème colonne:
For i = 0 To UBound(Mémo())
TabDonnées(i) = Left(Mémo(i, 0), 1) & Left(Mémo(i, 1), 1)
Next i
' Génère le classement de la clé en ordre croissant:
Classement = QuickSort_AndRank(TabDonnées, True)
y = Tableau.Row ' ligne d'origine du tableau.
y = y + 1 ' une ligne suplémentaire pour l'entête.
' Mise à jour des données du tableau (lignes et colonnes) d'après leur classement:
For i = 0 To UBound(Classement)
For x = 0 To (Tableau.Count / UBound(Tableau())) - 1
Cells(y, Tableau.Column + x) = Mémo(Classement(i), x)
Next x
y = y + 1
Next i
End Sub
'-------------------------------------------------------------------------------
Public Function QuickSort_AndRank(ByRef TabDonnées() As Variant, _
Optional ByVal OrdreCroissant As Boolean = True) As Variant
'-------------------------------------------------------------------------------
Dim i As Long, Mini As Long, Maxi As Long
Dim Anc As Long, Classement As Long
Mini = LBound(TabDonnées)
Maxi = UBound(TabDonnées)
ReDim Ref(Mini To Maxi) As Long
Dim Pos() As Long
' Initialise les données avant de les trier:
For i = Mini To Maxi: Ref(i) = i: Next i
' Trie les données:
If OrdreCroissant = True Then
Call QS(TabDonnées(), Ref(), Mini, Maxi)
Else
Call QSDEC(TabDonnées(), Ref(), Mini, Maxi)
End If
' Retourne le classement:
' ~~~~~~~~~~~~~~~~~~~~~~~
QuickSort_AndRank = Ref()
End Function
'-------------------------------------------------------------------------------
Private Sub QS(ByRef TabDonnées() As Variant, ByRef Ref() As Long, _
ByVal Gauche As Long, ByVal Droite As Long)
'-------------------------------------------------------------------------------
Dim i As Long, j As Long, Temp As Long, ValQS As Variant
i = Gauche
j = Droite
ValQS = TabDonnées(Ref((Gauche + Droite) / 2))
Do
While ValQS > TabDonnées(Ref(i)): i = i + 1: Wend
While ValQS < TabDonnées(Ref(j)): j = j - 1: Wend
If j + 1 > i Then
Temp = Ref(i)
Ref(i) = Ref(j)
Ref(j) = Temp
j = j - 1: i = i + 1
End If
Loop Until i > j
If Gauche < j Then Call QS(TabDonnées(), Ref(), Gauche, j)
If i < Droite Then Call QS(TabDonnées(), Ref(), i, Droite)
End Sub
'-------------------------------------------------------------------------------
Private Sub QSDEC(ByRef TabDonnées() As Variant, ByRef Ref() As Long, _
ByVal Gauche As Long, ByVal Droite As Long)
'-------------------------------------------------------------------------------
Dim i As Long, j As Long, Temp As Long, ValQS As Variant
i = Gauche
j = Droite
ValQS = TabDonnées(Ref((Gauche + Droite) / 2))
Do
While ValQS < TabDonnées(Ref(i)): i = i + 1: Wend
While ValQS > TabDonnées(Ref(j)): j = j - 1: Wend
If j + 1 > i Then
Temp = Ref(i)
Ref(i) = Ref(j)
Ref(j) = Temp
j = j - 1: i = i + 1
End If
Loop Until i > j
If Gauche < j Then Call QSDEC(TabDonnées(), Ref(), Gauche, j)
If i < Droite Then Call QSDEC(TabDonnées(), Ref(), i, Droite)
End Sub
'-------------------------------------------------------------------------------
'------------------------------------------------------------------------------- |