Instr et Like en série

Résolu
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 - 4 oct. 2005 à 15:04
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Derniè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 ?

10 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


PCPT
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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.....

PCPT
0
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
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.
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
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.
0

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

Posez votre question
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
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

Merci en tout cas de votre aide
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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.....
0
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
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.
0
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
4 oct. 2005 à 17:51
Ah ca m'a l'air tout-à-fait intéressant, mais il faut que je teste, j'ai un peu de mal à voir si sFound va bien me prendre tout le rst.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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
0
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
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.
0
Rejoignez-nous