Tri tableau bidimensionnel par VBA

laurent45

XLDnaute Occasionnel
Bonjour le Forum,

J'ai trouvé un petit script vba dans les archives, et j'ai essayé de l'adapter à mon problème.
Je voulais trier mon tableau bidimensionnel dans une combobox à 2 colonne avant de le recopier sur ma feuille.

Code:
Sub tri_Tableau()
Dim Valeur As Byte
Dim i As Integer
Dim Cible As Variant
Do 'tri
    Valeur = 0
    For i = 0 To UBound(CRTTab2) - 1
        If CRTTab2(i, 0) < CRTTab2(i + 1, 0) Then
            Cible = CRTTab2(i, 0)
            CRTTab2(i, 0) = CRTTab2(i + 1, 0)
            CRTTab2(i + 1, 0) = Cible
            Valeur = 1
        End If
    Next i
Loop While Valeur = 1
End Sub
Le problème, c'est que le tri ne se fait que sur une colonne (tout est mélangé), et en plus le tri n'est pas cohérent :
col1 col2 avant le tri
2.58 2
3.56 5
5.00 4
5.25 7

col1 col2 après le tri
5.25 2
5.00 5
2.58 4
3.56 7

Le problème, c'est que je ne comprends pas le script. :eek:

Le copier/coller n'a pas que du bon.

Merci
 

Hervé

XLDnaute Barbatruc
Bonjour laurent45

Ton souci doi venir que tu ne traites pas ta deuxième colonne lorsque tu interverti tes données, essaye comme ceci :

Sub tri_Tableau()
Dim Valeur As Byte
Dim i As Integer
Dim Cible As Variant
Dim k As Byte

Do 'tri
&nbsp; &nbsp; Valeur = 0
&nbsp; &nbsp;
For i = 0 To UBound(CRTTab2) - 1
&nbsp; &nbsp; &nbsp; &nbsp;
If CRTTab2(i, 0) < CRTTab2(i + 1, 0) Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
For k = 0 To UBound(CRTTab2, 2)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cible = CRTTab2(i, k)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CRTTab2(i, k) = CRTTab2(i + 1, k)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CRTTab2(i + 1, k) = Cible
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Valeur = 1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Next k
&nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp;
Next i
Loop While Valeur = 1
End Sub

sans garanti car non testé :whistle:

salut
 

laurent45

XLDnaute Occasionnel
Re le Forum,

Autant pour moi ! :whistle:

Après une analyse de ma question, j'ai redirigé ma recherche et j'ai trouvé ça :

Lien supprimé
Merci à Erci C

Edit : J'ai testé, Hervé. Ca fonctionne pour le déplacement des 2 argumenents de ligne. Mais reste le problème de l'ordre de tri.
Je vais travailler sur la fonction de Eric C
Encore Merci.

@+

Message édité par: laurent45, à: 04/10/2005 15:05
 

laurent45

XLDnaute Occasionnel
Bonsoir Hervé, le Forum,

J'ai réussi à adapter la fonction de tri d'une ComboBox pour 2 colonnes :

Public Function TriCombo(liSte)
Dim First As Integer, Last As Integer, i As Integer, j As Integer, Temp, Temp2

First = LBound(liSte)
Last = UBound(liSte)
For i = First To Last - 1
For j = i + 1 To Last
If CDbl(liSte(i, 0)) > CDbl(liSte(j, 0)) Then
Temp = liSte(j, 0)
Temp2 = liSte(j, 1)
liSte(j, 0) = liSte(i, 0)
liSte(j, 1) = liSte(i, 1)
liSte(i, 0) = Temp
liSte(i, 1) = Temp2
End If
Next j
Next i
TriCombo = liSte
End Function
Et là, j'ai bien compris de quoi il retournait.
J'ai rajouté CDbl(), parce que le tri ne tenait pas compte des nombre à 1 ou 2 chiffre (ex: 1 ou 11).

Pour ta Sub de Tri_tableau, j'ai fait de même :
Sub tri_Tableau()
Dim Valeur As Byte
Dim i As Integer
Dim Cible As Variant
Dim k As Byte

Do 'tri
Valeur = 0
For i = 0 To UBound(CRTTab2) - 1
If CDbl(CRTTab2(i, 0)) < CDbl(CRTTab2(i + 1, 0)) Then
For k = 0 To UBound(CRTTab2, 2)
Cible = CRTTab2(i, k)
CRTTab2(i, k) = CRTTab2(i + 1, k)
CRTTab2(i + 1, k) = Cible
Valeur = 1
Next k
End If
Next i
Loop While Valeur = 1

Bonne soirée

@+

Message édité par: laurent45, à: 05/10/2005 21:55
 

Discussions similaires

Réponses
7
Affichages
377
Réponses
5
Affichages
198

Statistiques des forums

Discussions
312 347
Messages
2 087 502
Membres
103 563
dernier inscrit
samyezzehar