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