Bonjour à toutes et à tous,
Je suis autodidacte en VBA et je souhaiterais avoir une réponse sur le tri d'un tableau à deux dimensions comportant 4 lignes et trois colonnes. Je n'ai pas trouvé malgré mes recherches, mais peut-être que je ne sais pas où bien chercher.
Tout d'abord, rendons à César ce qui est à César : je me suis inspiré très fortement d'un code donné par M. Boisgontier et j'ai utilisé le "QuickSort", et j'ai aussi parcouru ce site.
Voici mon tableau initial :

toto 50 Z
nono 30 C
dada 10 M
titi 4 F

lorsque je tri sur la seconde colonne, j'obtiens :

dada 10 M
nono 30 C
titi 4 F
toto 50 Z

Je ne comprends plus... Le tri sur les autres colonnes donne le résultat escompté mais pas sur la seconde, et je sèche : c'est comme si excel ne prenait que le premier chiffre en compte.
A quoi est-ce dû ? Comment obtenir un tri qui donnerait le résultat suivant :

titi 4 F
dada 10 M
nono 30 C
toto 50 Z

Petite précision : le tableau va alimenter une listbox.

Merci par avance pour vos réponses et contributions.


Je mets le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
' TRI D'UN ARRAY 2D via la colonne N°colTri
' a() = le tableau à trier
' gauc = indice bas du tableau
' droi = indice haut du tableau
' colTri = la colonne sur laquelle on effectue le tri
' http://boisgontierjacques.free.fr/
 
Sub tri(a(), gauc, droi, NbCol, colTri)        ' Quick sort (Jacques Boisgontier)
    ref = a((gauc + droi) \ 2, colTri)
    g = gauc: D = droi
        Do
            Do While a(g, colTri) < ref: g = g + 1: Loop
            Do While ref < a(D, colTri): D = D - 1: Loop
            If g <= D Then
                For C = 0 To NbCol - 1
                    temp = a(g, C): a(g, C) = a(D, C): a(D, C) = temp
                Next
 
                g = g + 1: D = D - 1
            End If
        Loop While g <= D
 
        If g < droi Then Call tri(a, g, droi, NbCol, colTri)
        If gauc < D Then Call tri(a, gauc, D, NbCol, colTri)
End Sub
 
Private Sub UserForm_Initialize()
 
    Dim tableau(4, 3) As Variant  'tableau(x,y) à deux dimensions, x lignes et y colonnes
    Dim i As Integer
 
    tableau(0, 1) = "toto"
    tableau(1, 1) = "nono"
    tableau(2, 1) = "dada"
    tableau(3, 1) = "titi"
    tableau(0, 2) = 50
    tableau(1, 2) = 30
    tableau(2, 2) = 10
    tableau(3, 2) = 4
    tableau(0, 3) = "Z"
    tableau(1, 3) = "C"
    tableau(2, 3) = "M"
    tableau(3, 3) = "F"
 
    For i = 0 To 3
        Me.ListBox1.ColumnCount = 3
        Me.ListBox1.ColumnWidths = "30;30;30"
        Me.ListBox1.AddItem
        Me.ListBox1.Column(0, i) = tableau(i, 1)
        Me.ListBox1.Column(1, i) = tableau(i, 2)
        Me.ListBox1.Column(2, i) = tableau(i, 3)
    Next
 
End Sub
 
Private Sub btntri_Click()
    Dim a()
    With Me
        a = .ListBox1.List
        NbCol = .ListBox1.ColumnCount
        Call tri(a(), LBound(a), UBound(a), NbCol, 1)
        .ListBox1.List = a
    End With
End Sub
Et je joins un petit fichier en plus :
test.xlsm