[VB] Trier Vart2 et Var 10 en ordre logique
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
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().
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
If a > b Then ...
Avec la fonction Cmp()
If Cmp(a , b) Then
Je n'ai pas prévu de fonction inverse (plus petit) pour y remédier suffit de mettre
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é.