pb tri sur chaine de caractères!!

  • Initiateur de la discussion brett
  • Date de début
B

brett

Guest
bonjour au forum ;o)

j'ai un pb avec le tri d'un tableau sur une colonne qui contient du texte et dont les clés une fois ftriées par ordre croissant sont:
BA020A
BA020D
BA020-EMI
BA020P
...

1ère chose bizarre après ce tri, j'en déduis au vu de l'ordre que le caractère '-' est :
- soit considéré commé étant compris entre le D et le P (mais j'en doute fort!)
- soit il n'est pas pris en compte, mais si c'est ça, pourquoi et comment résoudre ce pb ?!

car en effet, cela ne me gènerai pas le moins du monde que ce BA020-EMI soit entre BA020D et BA020P si le test suivant, suivait la même logique que le tri ,
car quand je teste si BA020-EMI > BA020D, et bien VBA me dit que non !!!!! (test = faux !!??) alors que c'est lui même qui me l'a mis dans cet ordre de tri

voila, je suis donc bloquer dans mon programme d'appareillage de tableau excel sur une clé commune à cause de ce pb.

quelqu'un peut-il m'expliquer pourquoi dans mon test de macro VBA, BA020-EMI est considéré comme inférieur à BA020D, alors que dans le tri, c'est l'inverse.

D'avance merci pour votre aide ;-)

a+

brett
 
A

andré

Guest
Salut brett,

Je viens de faire la même constatation que toi : Xl ne tient pas compte du - comme caractère et trie donc suivant la lettre qui suit le - (tiret)
Par contre, il en tient bien compte sous NBCAR().

Voici ce que l'aide (F1) en dit :

Les textes courants et ceux contenant des chiffres sont triés dans l'ordre suivant :
0 1 2 3 4 5 6 7 8 9 (espace) ! " # $ % & ( ) * , . / : ; ? @ [ \ ] ^ _ ` { | } ~ + < = > A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Les apostrophes (') et les traits d'union (-) sont ignorés, avec une exception toutefois : lorsque deux chaînes de texte ne se différencient que par la présence d'un trait d'union, la chaîne qui renferme celui-ci est classée en dernier.

Puisque tu es en VBA, je ne puis que te conseiller de remplacer les - (tirets) par un autre signe, de trier, puis de remplacer les autres signes par des -.

Ândré.
 
L

Lord Nelson

Guest
Salut Brett et André,

Effectivement, le trait d'union n'est pas pris en compte dans le tri.
On obtient ainsi :
Jean Paul
Jeanne
Jean-Paul

Donc, tu peux remplacer provisoirement le tiret par un espace, trier puis remettre le tiret, ce qui donnerait ceci, par exemple :

Sub TriSansTiret()
'Remplacement du tiret par un espace
Dim CL As Range
For Each CL In Range("A1:A4")
CL.Value = Replace(CL.Value, "-", " ")
Next
'Tri
Range("A1:A4").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
'Remplacement de l'espace par un tiret
For Each CL In Range("A1:A4")
CL.Value = Replace(CL.Value, " ", "-")
Next
End Sub

Si tu n'as pas d'espace au départ dans tes données à trier, ça marche, sinon, tu devras choisir un autre caractère de substitution.

A+
LN
 
B

brett

Guest
hello le forum et plus particulierement André et NL,

Pour info le pb est le même, même en remplaçant au préalable le '-' par '@' ou par '_' !!!
le tri place les caracteres @ ou _ avant le 0, alors que VBA considere lui que le 0 est le plus petit, et que @ et _ sont plus grand que 0 !
ça manque de cohérence sous XL sur ce point ...

bref André, l'aide F1 raconte des bobar pour ce qui est du tri en tout cas ;-)

enfin j'ai résolu le pb en remplaçant le '-' par un blanc (Merci NL)
même si j'aurait préféré trouvé un caractère plus exotique ;-)

@+ et faites attention à ce pb si un jour vous le rencontré

brett
 

Statistiques des forums

Discussions
312 789
Messages
2 092 125
Membres
105 226
dernier inscrit
Pepecham