cs_lacomm
Messages postés298Date d'inscriptionlundi 14 juin 2004StatutMembreDernière intervention 5 juillet 2013
-
4 oct. 2005 à 15:04
cs_lacomm
Messages postés298Date d'inscriptionlundi 14 juin 2004StatutMembreDernière intervention 5 juillet 2013
-
4 oct. 2005 à 18:08
Bonjour à tous,
J'ai un type défini:
Private Type mot
pos As Integer
long As String
End Type
J'ai une première fonction qui me renvoit un mot s'il est trouvé dans une phrase selon le modèle qu'elle contient
function modelelike (source as string) as string
modele = sourceA Like "*" & " " & motcible & " " & "*"
monresul = modele
If monresul = True Then
modelelike = motcible
Exit Function
Else: modelelike = 0
End If
end function
J'ai une deuxième fonction qui utilise la précédente pour donner la position et la longueur du mot cible:
Private Function cherche(source As String, mot As String) As mot
cherche.long = Len(mot)
cherche.pos = InStr(1, source, mot)
End Function
et l'appel des fonctions se fait comme ceci:
motlikem= cherche(source, motlike(source))
Tout ça marche très bien sauf quand le mot-cible est présent deux fois: c'est le premier qui compte, car malgré le filtre du modèle et de LIKE, INSTR récupère la première occurence du mot.
Ainsi, si le mot-cible est "ou", et que j'exclus tous mots commençant par n'importe quelle lettre comme ceci:
[!a-z] & "ou" & "*"
En effet, le modèle rejette bien "vous" et accepte "ou"
Mais dans une phrase où les deux sont présents, le modèle est forcément vrai, et LIKE renvoit le mot, et donc INSTR renvoit la première occurence.
Une idée ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 oct. 2005 à 17:25
umm. ok
tiens, je sais pas si çà t'aide, puisque t'as toujours pas spécialement précisé...
Option Explicit
'
'
Private Type tMot
tPos As Integer
tLong As String
tVerif As Boolean
End Type
'
'
Private Function FindLike(sSource As String, sFound As String) As tMot
'init optionnelle FindLike.tPos 0: FindLike.tLong 0: FindLike.tVerif = False
'Len
FindLike.tLong = Len (sFound)
'vérifie l'existance de sFound
If Not (sSource Like "*" & " " & sFound & " " & "*") Then
Exit Function
Else
FindLike.tPos = InStr(1, sSource, " " & sFound & " ") + 1
FindLike.tVerif = True
End If
End Function
'
'
Private Sub Command1_Click()
Dim Ret As tMot
Ret = FindLike("salut, vous allez bien?", "ou")
MsgBox Ret.tPos & vbCrLf & Ret.tLong & vbCrLf & Ret.tVerif
Ret = FindLike("tampon ou serviette ?", "ou")
MsgBox Ret.tPos & vbCrLf & Ret.tLong & vbCrLf & Ret.tVerif
End Sub
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 oct. 2005 à 15:50
salut,
la fin, j'ai décroché. trop de blabla sans en arriver au but qui m'est encore trop flou...
par contre :
1. Option explicit a sans doute été oublié. met le, tu verras déjà tout de suite que ta première fonction est fausse !
2. type : long = MOT RESERVé
3. fonction1 : modele non déclaré (cf 1ère remarque)
4. fonction1 : sourceA il sort d'où?
etc..., on ne sait pas ce qui est déclaré en global, donc bref, problème difficilement représentable... (pour moi du moins)
tu appelles ta fonction2 avec un paramètre motlike(source), c'est quoi, un tableau? t'as pas de fonction de ce nom.....
cs_lacomm
Messages postés298Date d'inscriptionlundi 14 juin 2004StatutMembreDernière intervention 5 juillet 20131 4 oct. 2005 à 16:07
Oui désolé mais je dois résumer, le programme utilise des bases de données et ADO etc.
1) pour long, ca marche bien sauf dans ce cas précis, mais tu as raison, j'ai désactivé 'option explicit'
2) il faut lire source et pas sourceA
3) le but: dans une phrase comme celle-ci
vous souhaitez ceci ou cela?
je veux obtenir la position du mot "ou" en bleu, mais les fonctions, comme elles sont écrites me donnent la position du premier "ou" en rouge. J'ai pu bricoler en remplaçant " ou " par " !ou " dans la source et dans la BD, mais c'est pas très élégant, surtout que c'est pas le seul mot. Je me demande si je ne devrais pas écrire une fonction spéciale pour le cas des mots courts.
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 4 oct. 2005 à 16:39
salut
je ne suis pas sur de tout bien comprendre, alors désolé si ma proposition est a coté de la plaque, mais pourquoi ne fait tu pas plutot une recherche sur [espace][mot][espace]
soit recherche " ou " plutot que "ou" tout court. comme ca la fonction ne retournerais pas la position du ou en rouge qui entouré d'un "v" et d'un "s" (je ne sais pas si je suis bien clair)
attention toutefois pour cette solution, il faudra ajouter une espace au debut et a la fin de la phrase dans laquelle tu fait la recherche pour que ta fonction trouve aussi un mot qui se trouve au debut ou a la fin.
bon, désolé c'est pas trés facile a expliquer, mais si il y a quelque chose que tu n'a pas compris dans mon explication dis le moi.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_lacomm
Messages postés298Date d'inscriptionlundi 14 juin 2004StatutMembreDernière intervention 5 juillet 20131 4 oct. 2005 à 16:54
J'ai essayé ta solution me semble-t-il:
modele= source like " " & motcible & " "
mais ça ne marche pas car il faut précisément " ou " alors que bien souvent on a "*" & " " & "ou" & " " & "*"
En fait, ce qui se passe, c'est que l'ordre des fonctions fait que
1) LIKE permet un tri précis grâce à un modèle
2) INSTR ne tient pas compte du modèle
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 oct. 2005 à 17:07
il sort de où MOTCIBLE
c'est ton fameux "ou" ? il est public?
tu veux de l'aide ou juste copier un morceau de code non-fonctionnel inexpliqué en attendant un miracle.....
cs_lacomm
Messages postés298Date d'inscriptionlundi 14 juin 2004StatutMembreDernière intervention 5 juillet 20131 4 oct. 2005 à 17:21
motcible c'est un mot d'une des bases de données que j'utilise.
en fait, en réalité, ce sont les cellules d'un recordset qui est parcouru du début à la fin.
(je passe le code de la boucle, c'est pas le problème)
modele=source like "*" & " " & rst1(0) & " " & "*"
Dans l'exemple c'est "ou" parce que précisément je n'ai aucun problème avec les mots plus longs.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 oct. 2005 à 17:59
à toi d'adapter....
Ret = FindLike("tampon ou serviette ?", rst1(0))
ps : tLong n'est pas à déclarer en String comme je l'ai fait par inattention....
PCPT
cs_lacomm
Messages postés298Date d'inscriptionlundi 14 juin 2004StatutMembreDernière intervention 5 juillet 20131 4 oct. 2005 à 18:08
Impeccable, bravo, un grand merci et désolé pour le manque de précision, je ne suis pas programmeur de métier et il y a sans doute des choses importantes qui m'échappent.