Problème de chaînes !!!

Résolu
cs_eric03 Messages postés 20 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 2 mai 2005 - 25 févr. 2005 à 22:27
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 - 1 mars 2005 à 09:22
Bonjour !

Voila mon souci : sur un formulaire j'ai 'Texte14' rempli avec une référence :
ex.:'Poste de travail'. A l'aide d'un code, il faut que je supprime les mots de moins de 5 lettres (reste 'Poste travail'). Ensuite, je dois remplacer les espaces par des +. ('Poste+travail').

Comment puis-je faire, SVP ???

Merci d'avance !

Eric

9 réponses

tryborg Messages postés 29 Date d'inscription lundi 31 janvier 2005 Statut Membre Dernière intervention 1 mars 2005
25 févr. 2005 à 23:05
Je ne c pas si mon algo est efficace mais ca marche, j'ai bidouillé ca en deux minute :

Dim i As Long

Machaine$ = "Poste de travail et tout autres chaines de caractères..."

For i = 1 To Len(Machaine$)
If Mid$(Machaine$, i, 1) = " " Then
If Mid$(Machaine$, i + 3, 1) = " " Then
Machaine$ = Left$(Machaine$, i - 1) & "+" & Mid$(Machaine$, i + 4, Len(Machaine$))

Else:
Machaine$ = Left$(Machaine$, i - 1) & "+" & Mid$(Machaine$, i + 1, Len(Machaine$))

End If
End If
Next i

Text1.Text = Machaine$

Voilivoilou...


tryborg
3
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
26 févr. 2005 à 00:32
Autre proposition :
Function TraiteChaine(ByVal LaChaine As String) As String
Dim M() As String, i As Long, Buffer As String

; On éclat la chaien en mot dans un tableau
M = Split(LaChaine, " ")
; Pour chaque élément de tableau
For i = LBound(M) To UBound(M)
; S'il fait moins de 5 car. de long on l'éfface
If Lenb(M(i))<10 Then M(i) = ""
Next
; On reconstruit la chaine avec des "+" entre les mots
Buffer = Join$(M, "+")
; Tant qu'il y a deux "+" l'un a coté de l'autre
While Instr(Buffer, "++") > 0
; On les remplace par un seul "+"
Buffer = Replace$(Buffer, "++", "+")
Wend
" On revoie le tampon
TraiteChaine = Buffer
End Function

Avec cela, ça devrait passer
Christophe R
3
tryborg Messages postés 29 Date d'inscription lundi 31 janvier 2005 Statut Membre Dernière intervention 1 mars 2005
26 févr. 2005 à 00:36
C une autre possibilité, à partir de VB6 seulement, car je n'ai point cette function Split dans VB5, malheureusement...


tryborg
0
cs_eric03 Messages postés 20 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 2 mai 2005
26 févr. 2005 à 03:49
Salut !

Merci à vous pour les codes, les deux fonctionnent et vont me servir, car selon les chaînes, on n'arrive pas toujours au même résultat, en appliquant l'une ou l'autre méthode.

Vraiment un grand merci !!!!!

Eric
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cqui789 Messages postés 261 Date d'inscription jeudi 13 janvier 2005 Statut Membre Dernière intervention 18 mai 2009 3
27 févr. 2005 à 13:27
Tu n'obtiend pas la meme chose parceque tryborg ne detecte que les mots de 2 lettres et crenaud76 detecte les mots jusqu'a 9 lettres...
0
cs_eric03 Messages postés 20 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 2 mai 2005
27 févr. 2005 à 13:47
Tu es dans l'erreur, le code de Triborg ne prend que les mots SUPERIEURS à 2 lettres mais le résultat est parfait. Pour le code de Crenaud76, essaye-le d'abord et tu verra qu'il fonctionne très bien.

Eric
0
cqui789 Messages postés 261 Date d'inscription jeudi 13 janvier 2005 Statut Membre Dernière intervention 18 mai 2009 3
27 févr. 2005 à 15:48
Desole Crenaud76, je ne connaissait pas la fonction lenb, que j'ai confondu avec len, je n'ai pas trouve de doc a ce sujet.



pour ce qui est de tryborg, je confirme qu'il ne detecte que les mots
de 2 lettres, c'est a dire qu'il te laisse les mots d'une lettre en
plus de ceux superieurs a 2 lettre et apres essai, je constate que si 2
mots de 2 lettres se suivent, il laisse le deuxieme

mettons que tu tappe (c'est juste un exemple)



vue de la fenetre a la jetee fin



Crenaud76 donne :

+fenetre+jetee+

Ok si les + avant et apres ne te genent pas



tryborg donne:

vue+la+fenetre+a+jetee+fin

Garde un 2 lettres et le 1 lettres.



J'ai essaye de refaire le code de Crenaud76 sans le split et plus
simple mais je doit avouer que je me suis perdu dans des boucles....
0
cqui789 Messages postés 261 Date d'inscription jeudi 13 janvier 2005 Statut Membre Dernière intervention 18 mai 2009 3
27 févr. 2005 à 16:49
Je ne voulait pas rester sur une critique sans proposer ma solution.



Je n'arrivait pas a enlever les premiers et derniers mots si
necessaire, il sufisait de rajouter un espace de chaque cote et enlever
les + resultants apres...




Function TraiteChaine(ByVal LaChaine As String) As String

Dim PosEsp As Integer, PosEspSuiv As Integer, chaine As String

' on ajoute des espaces pour traiter automatiquement les premier et dernier mots

chaine = " " & LaChaine & " "

PosEsp = 1 ' position du premier espace, celui qu'on vient de rajouter

Do Until PosEsp = 0 ' tant qu'il y a un espace a traiter

' pointe sur l'espace suivant si il est a moins de 5 positions

PosEspSuiv = InStr(Mid$(chaine, PosEsp + 1, 5), " ")

' remplace l'espace et le mot eventuel par un +

chaine = Left$(chaine, PosEsp - 1) & "+" & Mid$(chaine, PosEsp + 1 + PosEspSuiv, Len(chaine))

' ne passe a
l'espace suivant que si pas trouve de mot a remplacer pour le cas de
plusieurs mots de moins de 5 lettres se suivant

If PosEspSuiv 0 Then PosEsp InStr(chaine, " ")

Loop

' si au moins un mot de + de 5 lettres trouve, on retire les "+" du debut et de la fin

TraiteChaine = IIf(Len(chaine) > 2, Mid$(chaine, 2, Len(chaine) - 2), "")



End Function
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
1 mars 2005 à 09:22
Je détecte tous les mots, quel que soit leur longueur ! je ne m'arrete pas au mot de 9 lettres c'est mon test '< 10' qui vous fait penser cela ?
Le Lenb() retourne la longueur d'une chaine ... en octet, donc le double d'un Len() ! C'est pourquoi, afin de stopper les mots de mois de cinq lettre je fait un test de Lenb(Mot(i)) par rapport à 10 (=5*2).
Pourquoi utiliser Lenb() plutot que Len() !! Car Lenb() est plus rapide que Len(). En effet, Len() fait appel à Lenb et ensuite, il divise le résultat par deux !! On gagne donc une division par deux (d'accord c'est une opération tres rapide : décalage d'un bit sur la droite) mais c'est toujours ca de gagner ! j'ai l'habitude de l'utiliser quand ca ne complique pas le code.
Pour ce qui est des + en début et en fin (je n'avais pas fait attention car j'ai pondu le code sans le tester ) Il suffit de remplacer la dernière ligne par TRaiteChaine = Mid$(Buffer, 2, Len(Buffer)-2) ! Et la, ce n'est pas un Lenb() !! C'est bien un Len() !!
Pour ce qui est de al version Split() en vB5, il existe plein de version de cette fonction (il y en a sans doute içi meme sur ce site, je n'ai pas regardé mais je doute fort que cette question n'ai jamais trouvé de solution !)Sans doute Idem pourle Join() qui doit aussi te manquer en VB5

Christophe R
0
Rejoignez-nous