Bonjour,
Comment pourrais-je trier une variable tableau à 2 dimensions en VBA (tri sur une seule dimension)
Remerciements
Bonjour,
Comment pourrais-je trier une variable tableau à 2 dimensions en VBA (tri sur une seule dimension)
Remerciements
Salut,
En cherchant 5 secondes dans le menu recherche je trouve ceci :
http://silkyroad.developpez.com/vba/tableaux/#LXIV-D
Bonjour,
copié de l'un de mes projets
tire de l'excellent site de J. BoisGontier : http://boisgontierjacques.free.fr/
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 ' 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 (JBGontier) 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
Et l'un des appels que j'effectue
Le tableau à trier est ici la plage de données présentent dans un ListBox, via un Combobox qui permet de choisir la colonne à trier
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Private Sub ComboBox_TRI_Change() Dim a() With Me If .ComboBox_TRI.ListIndex = -1 Then Exit Sub a = .ListBox1.List NbCol = .ListBox1.ColumnCount Call tri(a(), LBound(a), UBound(a), NbCol, .ComboBox_TRI.ListIndex + 1) .ListBox1.List = a End With End Sub
Vois-tu l'ombre d'une feuille, d'un range, d'un cells dans ces codes ?
c'est uniquement un tableau VBA qui est utilisé ici
1) création d'un tableau en puisant les données d'un listbox (le .List)
2) envoi du tableau à la fonction de tri, en indiquant les paramètres souhaités
3) la fonction trie le tableau et rend la main à la procédure appelante
4) la procédure appelante injecte le tableau dans listbox, qui vient donc remplacer le précédent agencement des données
et si on veut en fait réaliser ce travail sur une plage de données d'une feuille excel, il suffit de modifier l'étape 1 (on récolte une plage de données excel) et 4 (on restitue les éléments dans la feuille excel). Ce qui fait que toute la partie technique du tri n'est pas impactée.
==> mais trier une plage excel, autant utiliser les outils dédiés : voir l'aide VBA au sujet de "Sort"
Ne poussons pas Mémé dans les orties, tu nous indiques vouloir un tri sur une dimension
Pour trier la seconde colonne, on fait un peu travailler son esprit logique, non ?
se transformera en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 For i = 0 To UBound(Tableau) - 1 If Tableau(i) < Tableau(i + 1) Then Cible = Tableau(i) Tableau(i) = Tableau(i + 1) Tableau(i + 1) = Cible Valeur = 1 End If Next i
a adapter evidemment a ton cas de figure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 For i = 0 To UBound(Tableau,0) - 1 If Tableau(i,0) < Tableau(i + 1,0) Then Cible = Tableau(i,0) Tableau(i,0) = Tableau(i + 1,0) Tableau(i + 1,0) = Cible Cible = Tableau(i,1) Tableau(i,1) = Tableau(i + 1,1) Tableau(i + 1,1) = Cible Valeur = 1 End If Next i
Nous pouvons t'expliquer comment pecher, mais il n'est pas admis de demander a ce qu'on peche pour toi :-]
Bonjour,
Comparaison d'un tri multi-colonnes indexé et non indexé.
Pour un Array 36.000 lignes et 10 colonnes, le temps d'un tri indexé est 3 fois inférieur à celui d'un tri non indexé (0,4 sec au lieu de 1,2 sec)
PSans le fichier joint, il y a seulement 8.000 lignes.
Boisgontier
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 Dim f, ListeVille() Private Sub UserForm_Initialize() '--villes +codes postaux ListeVille = Range("bdd").Value Me.ComboVille.List = ListeVille '-- inversion des colonnes 1,2 pour un tri par code postal b = Application.index([bdd], Evaluate("Row(1:" & [bdd].Rows.Count & ")"), Array(2, 1, 3, 4, 5, 6, 7, 8, 9, 10)) TriTableauIndex b ' + rapide Me.CodePostal.List = b End Sub Sub TriTableauIndex(b) Dim Tmp(): ReDim Tmp(LBound(b) To UBound(b), LBound(b, 2) To UBound(b, 2)) Dim clé() As String: ReDim clé(LBound(b) To UBound(b)) Dim index() As Long: ReDim index(LBound(b) To UBound(b, 1)) For i = LBound(b) To UBound(b) clé(i) = b(i, 1): index(i) = i Next i TriIndex clé(), index(), LBound(b), UBound(clé) For lig = LBound(clé) To UBound(clé) For col = LBound(b, 2) To UBound(b, 2): Tmp(lig, col) = b(index(lig), col): Next col Next lig b = Tmp End Sub Sub TriIndex(clé() As String, index() As Long, gauc, droi) ' Quick sort ref = clé((gauc + droi) \ 2) g = gauc: d = droi Do Do While clé(g) < ref: g = g + 1: Loop Do While ref < clé(d): d = d - 1: Loop If g <= d Then temp = clé(g): clé(g) = clé(d): clé(d) = temp temp = index(g): index(g) = index(d): index(d) = temp g = g + 1: d = d - 1 End If Loop While g <= d If g < droi Then TriIndex clé, index, g, droi If gauc < d Then TriIndex clé, index, gauc, d End Sub
PS: Eviter d'utiliser le tri bubble. Pour trier 36.000 items, il faudrait plusieurs heures.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager