Bonjour,
Je cherche à obtenir un tri dans un tableau comportant plusieurs colonnes.
Sur Excel 2007, il est possible d'obtenir cela via Donnée=>trier et en triant par niveau dans la boîte de dialogue "Tri".
Je cherche à obtenir le même résultat mais en utilisant des arrays.
Je pensais y être arrivé en procédant comme suit :
- charger le tableau de la feuille de calcul dans un array
- regrouper les différentes données d'une ligne au sein d'une même chaîne
- utiliser un quick sort emprunté à JB
- utiliser un split pour re dispatcher les différentes données triées dans la feuille de calcul.
La procédure en elle-même fonctionne sauf que je bute sur un problème : la colonne 2 comporte des âges. tant que ceux-ci sont inférieurs à 100, le tri est effectué correctement. Si l'âge est égale ou supérieur à 100 : problème.
J'en conclus donc que la chaîne est traitée comme une chaîne de caractère et que 100 n'est pas traité comme nombre mais comme 1 0 0.
J'ai testé éventuellement un option compare ainsi que le fait d'utiliser Cdbl si la valeur est numérique, mais sans résultat.
Avant éventuellement d'envisager d'autres approches, je voudrais savoir si vous aviez une solution pour résoudre ce problème.
Le tableau exemple est tiré d'un fichier produit par Misange que vous pouvez trouver Ce lien n'existe plus et que je vous recommande.
A+
Je cherche à obtenir un tri dans un tableau comportant plusieurs colonnes.
Sur Excel 2007, il est possible d'obtenir cela via Donnée=>trier et en triant par niveau dans la boîte de dialogue "Tri".
Je cherche à obtenir le même résultat mais en utilisant des arrays.
Je pensais y être arrivé en procédant comme suit :
- charger le tableau de la feuille de calcul dans un array
- regrouper les différentes données d'une ligne au sein d'une même chaîne
- utiliser un quick sort emprunté à JB
- utiliser un split pour re dispatcher les différentes données triées dans la feuille de calcul.
La procédure en elle-même fonctionne sauf que je bute sur un problème : la colonne 2 comporte des âges. tant que ceux-ci sont inférieurs à 100, le tri est effectué correctement. Si l'âge est égale ou supérieur à 100 : problème.
J'en conclus donc que la chaîne est traitée comme une chaîne de caractère et que 100 n'est pas traité comme nombre mais comme 1 0 0.
J'ai testé éventuellement un option compare ainsi que le fait d'utiliser Cdbl si la valeur est numérique, mais sans résultat.
Avant éventuellement d'envisager d'autres approches, je voudrais savoir si vous aviez une solution pour résoudre ce problème.
Le tableau exemple est tiré d'un fichier produit par Misange que vous pouvez trouver Ce lien n'existe plus et que je vous recommande.
Code:
Option Explicit
'Option Compare Text
'Option Compare Binary
Sub TriMultiColonne()
Dim tblo, Pl, i, j, temp
Set Pl = Sheets("Feuil1").Range("A2").CurrentRegion.Offset(1) _
.Resize(Sheets("Feuil1").Range("A2").CurrentRegion.Rows.Count - 1)
tblo = Pl.Value
Dim tblo2()
ReDim Preserve tblo2(1 To Pl.Rows.Count)
For i = 1 To Pl.Rows.Count
For j = 1 To Pl.Columns.Count
'If IsNumeric(tblo(i, j)) Then
' tblo2(i) = tblo2(i) & CDbl(tblo(i, j)) & ""
'Else
tblo2(i) = tblo2(i) & tblo(i, j) & "#"
'End If
Next j
Next i
temp = tblo2
Call tri(temp, LBound(temp), UBound(temp))
Dim tblo3()
ReDim Preserve tblo3(1 To Pl.Rows.Count)
For i = 1 To Pl.Rows.Count
For j = 1 To Pl.Columns.Count
tblo3(i) = Split(temp(i), "#")
Next j
Next i
Sheets("Feuil1").Range("H2").Resize(Pl.Rows.Count, Pl.Columns.Count) = _
Application.Transpose(Application.Transpose(tblo3))
End Sub
Sub tri(a, gauc, droi) ' Quick sort
Dim g, d, ref, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub