[VB] Trier Vart2 et Var 10 en ordre logique

Forum pour partager vos connaissances et vos astuces Excel / VBA ...
Avatar du membre
lermite
Membre impliqué
Membre impliqué
Messages : 1599
Inscrit le : 5 février 2012
Version d'Excel : 2000/2007FR

Message par lermite » 29 août 2012, 12:47

Quand vous faites un tri sur une feuille ou par VBA sur des variables contenant du texte et se terminant par un nombre le tri n'est pas logique, Excel considère, par exemple Code3 est plus grand que Code22 ?
Exemple avec l'image ci-dessous
Image
La colonne B étant la colonne à trier.
La colonne D triée avec Excel ou VBA ou WorkSheetFunction.
La colonne F triée avec la fonction Cmp().

Code : Tout sélectionner

Public Function Cmp(a, b) As Boolean
Dim i As Integer, e As Integer
   If Len(a) = Len(b) Then
        If a > b Then Cmp = True
        Exit Function
    End If
    i = Len(a): e = Len(b)
    Do While IsNumeric(Mid(a, i)) And Mid(a, i) <> " ": i = i - 1: Loop
    Do While IsNumeric(Mid(b, e)) And Mid(b, i) <> " ": e = e - 1: Loop
    If Left(a, i) > Left(b, e) Then Cmp = True: Exit Function
    If Left(a, i) < Left(b, e) Then Exit Function
    If Len(a) - i > Len(b) - e Then Cmp = True: Exit Function
    If Len(b) - i > Len(a) - e Then Exit Function
    If Mid(a, i) > Mid(b, e) Then Cmp = True
End Function
Cette fonction n'est intéressante que dans les conditions décrites ci-dessus, elle est bien évidemment un peu plus lente que la fonction de comparaison directe.
Exemple d'utilisation :
Normalement un test de comparaison se fait par

Code : Tout sélectionner

    If a > b Then ...
Avec la fonction Cmp()

Code : Tout sélectionner

    If Cmp(a , b) Then
Je n'ai pas prévu de fonction inverse (plus petit) pour y remédier suffit de mettre

Code : Tout sélectionner

    If Not Cmp(a , b) Then
Je l'ai testée et retestée mais une erreur est toujours possible, dans ce cas veuillez m'en informé.
Tout problème a une solution, le vrai problème... c'est de la trouver.
  • Sujets similaires
    Réponses
    Vues
    Dernier message