dionys0s
XLDnaute Impliqué
Bonjour le forum
je cherche à améliorer mon algorithme de tri rapide d'un tableau à une dimension, de telle sorte qu'il puisse trier correctement les chaînes de caractère qui contiennent des nombres. Pour le moment, le tableau {"10 blabla", "2 blabla", "1 blabla", "20 blabla"} après trié comme ceci {"1 blabla", "10 blabla", "2 blabla", "20 blabla"}, et j'aimerais qu'il soit trié comme ceci : {"1 blabla", "2 blabla", "10 blabla", "20 blabla"}.
C'est quelque chose qu'Excel fait tout seul quand on utilise la fonction sort (XlSortDataOption = xlSortTextAsNumbers), mais j'aimerais me passer d'écrire le contenu de ma variable tableau dans un onglet temporaire, et donc uniquement me baser sur la comparaison de texte.
D'avance merci pour votre aide !
je cherche à améliorer mon algorithme de tri rapide d'un tableau à une dimension, de telle sorte qu'il puisse trier correctement les chaînes de caractère qui contiennent des nombres. Pour le moment, le tableau {"10 blabla", "2 blabla", "1 blabla", "20 blabla"} après trié comme ceci {"1 blabla", "10 blabla", "2 blabla", "20 blabla"}, et j'aimerais qu'il soit trié comme ceci : {"1 blabla", "2 blabla", "10 blabla", "20 blabla"}.
C'est quelque chose qu'Excel fait tout seul quand on utilise la fonction sort (XlSortDataOption = xlSortTextAsNumbers), mais j'aimerais me passer d'écrire le contenu de ma variable tableau dans un onglet temporaire, et donc uniquement me baser sur la comparaison de texte.
D'avance merci pour votre aide !
VB:
Public Sub SortArr(ByRef Arr() As Variant, ByVal Ord As Excel.XlSortOrder, ByVal LBnd As Long, ByVal UBnd As Long)
Dim Memo As Variant, x As Long, Idx As Long
Dim NewIdx As Long, Modif As Boolean
Do: x = 1 + 3 * x: Loop Until x > (UBnd - LBnd + 1)
If Ord = Excel.xlAscending Then
Do: x = x / 3: For Idx = x + LBnd To UBnd
Memo = Arr(Idx): NewIdx = Idx
Do While Arr(NewIdx - x) > Memo: Modif = True
Arr(NewIdx) = Arr(NewIdx - x)
NewIdx = NewIdx - x: If NewIdx < x + LBnd Then Exit Do
Loop: If Modif Then Arr(NewIdx) = Memo
Modif = False: Next Idx: Loop Until x = 1
ElseIf Ord = Excel.xlDescending Then
Do: x = x / 3: For Idx = x + LBnd To UBnd
Memo = Arr(Idx): NewIdx = Idx
Do While Arr(NewIdx - x) < Memo: Modif = True
Arr(NewIdx) = Arr(NewIdx - x)
NewIdx = NewIdx - x: If NewIdx < x + LBnd Then Exit Do
Loop: If Modif Then Arr(NewIdx) = Memo
Modif = False: Next Idx: Loop Until x = 1
End If
End Sub