cs_eric03
Messages postés20Date d'inscriptionjeudi 2 octobre 2003StatutMembreDernière intervention 2 mai 2005
-
25 févr. 2005 à 22:27
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDerniè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').
tryborg
Messages postés29Date d'inscriptionlundi 31 janvier 2005StatutMembreDerniè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$))
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 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
cs_eric03
Messages postés20Date d'inscriptionjeudi 2 octobre 2003StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_eric03
Messages postés20Date d'inscriptionjeudi 2 octobre 2003StatutMembreDerniè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.
cqui789
Messages postés261Date d'inscriptionjeudi 13 janvier 2005StatutMembreDernière intervention18 mai 20093 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....
cqui789
Messages postés261Date d'inscriptionjeudi 13 janvier 2005StatutMembreDernière intervention18 mai 20093 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
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 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