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
| Option Explicit
Private PL As Range 'déclare la variable PL (PLage)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'si le nombre de cellules sélectionnées est supérieur à 1, définit la plage PL
If Target.Cells.Count > 1 Then Set PL = Selection
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim TMP1 As Variant 'déclare la variable TMP1 (tableau TeMPoraire 1)
Dim TMP2 As Variant 'déclare la variable TMP2 (tableau TeMPoraire 2)
Dim VT1 As Integer 'déclare la variable VT1 (Valeur Temporaire 1)
Dim VT2 As Integer 'déclare la variable VT2 (Valeur Temporaire 2)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
If Target.Cells.Count > 1 Then Exit Sub 'si plusieurs cellules sélectionnées, sort de la procédure
Cancel = True 'annuole le mode [Édition] lié au double-clic
Set D = CreateObject("Scripting.Dictionary") 'définit la dictionnaire D
For Each CEL In PL 'boucle sur toutes les cellules CEL de la plage PL
D(CEL.Value) = D(CEL.Value) + 1 'alimente le dictionnaire
Next CEL 'prochaine cellule de la boucle
TMP1 = D.KEYS 'récupère les valeur uniques du dictionnaire (sans doublon) dans le tableau temporaire TMP1
TMP2 = D.ITEMS 'récupère le nombre de chaque valeur unique dans le tableau temporaire TMP2
'tri décroissant
For I = 0 To UBound(TMP2) 'boucle 1 sur toutes les valeurs du tableau TMP2
For J = 0 To UBound(TMP2) 'boucle 1 sur toutes les valeurs du tableau TMP2
If TMP2(I) > TMP2(J) Then 'condition : si la valeur de la boucle 1 est supérieure à la valeur de la boucle 2
VT2 = TMP2(I): TMP2(I) = TMP2(J): TMP2(J) = VT2 'rétrograde la position de la valeur inférieure dans le tableau TMP2
VT1 = TMP1(I): TMP1(I) = TMP1(J): TMP1(J) = VT1 'rétrograde la position de la valeur associée dans le tableau TMP1
End If 'fin de la condition
Next J 'prochaine valeur de la boucle 2
Next I 'prochaine valeur de la boucle 1
Target.Resize(D.Count, 1) = Application.Transpose(TMP1) 'renvoie la liste dans l'ordre dans la cellule double-cliquée
End Sub |