Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/01/2012, 10h54   #1
Invité régulier
 
Homme Cédric
Étudiant
Inscription : septembre 2011
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Localisation : France, Aveyron (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 36
Points : 9
Points : 9
Par défaut Recherche par mot clés

Bonjour à tous,

Je bloque sur une requête en sql permettant de faire une recherche, je vous explique :
J'ai une table regroupant des articles, avec les champs num, description (etc..)
J'essaie de programmer un moteur permettant de saisir plusieurs mots et les rechercher dans le champ description.
Mon problème : il ne me faut pas une recherche "exacte", c'est à dire :
si je cherche "joint torique" je dois pouvoir trouver aussi bien l'article : "joint torique diamètre 45" que "grand joint pas du tout torique" (j'espère que je suis clair )

A l'heure actuelle j'utilise ce code qui me permet d'avoir que la recherche "exacte" du groupe de mot : "diam 46 joint torrique" et pas "grand joint pas du tout torique"

Code :
1
2
Liste0.RowSource = "SELECT DISTINCTROW mabase_matable.ITEMNUM, mabase_matable.DESCRIPTION
FROM mabase_matable WHERE ((mabase_matable.DESCRIPTION) Like '*" & Texte2.Value & "*');"
Il faudrait détecter les espace et en faire deux critères de recherches non?!

Merci d'avance
Dewey12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 12h07   #2
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 40
Points : 27
Points : 27
Bonjour,

je viens de faire un petit quelque chose sur le sujet de la similarité entre deux mots. Pour ma part, j'ai opté pour utiliser la notion de distance au sens de Jaro. J'ai donc implémenté cette fonction.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
'------------------------------------------------------------
'Jaro
'-- Renvoie la distance au sens de Jaro entre deux chaînes
'-- vaut 1 pour deux chaînes identiques
'-- vaut 0 pour deux chaînes totalement dissemblables
'-- biblio :
'-- http://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
'-- http://lingpipe-blog.com/2006/12/13/code-spelunking-jaro-winkler-string-comparison/
'-- http://www.codeguru.com/forum/showthread.php?t=256360
'------------------------------------------------------------
Public Function Jaro(s1 As String, s2 As String) As Double
Si tu implémentais une fonction de comparaison de deux mots, il ne resterait ensuite plus qu'à modifier ton critère :

Code :
1
2
3
4
5
6
 
' limite à faire bouger au besoin
maxJ = 0.8
[...]
Liste0.RowSource = "SELECT DISTINCTROW mabase_matable.ITEMNUM, mabase_matable.DESCRIPTION
FROM mabase_matable WHERE (Jaro(mabase_matable.DESCRIPTION,Texte2.Value) > maxJ );"
A toi de choisir celle qui te convient le mieux. Les notions abordées ne sont pas les mêmes pour comparer deux mots ou deux phrases ou encore deux textes entiers.
rstck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 12h58   #3
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 40
Points : 27
Points : 27
En fait mesurer la similarité de phrases avec cette fonction a ses limites, elle est surtout utilisée dans la correction orthographique, si j'ai bien compris. Dans tes deux exemples, la requête est "joint torique". Le premier terme fait un bon match
Code :
1
2
?Jaro("joint torique","joint torique diamètre 45")
0,84
mais pas le deuxième
Code :
1
2
?Jaro("joint torique","grand joint pas du tout torique")
0,547
Jusque là, c'est cohérent.

Ensuite, on a un mauvais score pour
Code :
1
2
?Jaro("joint torique","cellules spéciales pour joint")
 0,32
Mais ce dernier est moins bien que
Code :
1
2
?Jaro("joint torique","cellules toit spéciales")
0,508
qui n'a pourtant rien à voir avec un joint... mais il y a des "o" et des "t" là où il faut donc le score est meilleur. Il faudrait donc rajouter à la mesure de similarité la condition de la présence exacte d'un terme au moins.

Une autre idée (sans doute meilleure) serait plutôt que de mesurer numériquement la ressemblance, renvoyer une valeur binaire ; en découpant ta phrase de requête en mots en fonction des espaces, tu peux tester la présence de ces mots à l'intérieur d'une chaîne (tous ces mots, ou un au moins, ou une majorité de mots, ou ...) et renvoyer vrai ou faux.

Ton idée avec like est bonne, plutôt que de l'implémenter en SQL, tu peux juste rédiger une fonction en VBA en utilisant des fonctions comme InStr(). Je ne sais pas si c'est super clair.

HTH
rstck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 13h15   #4
Invité régulier
 
Homme Cédric
Étudiant
Inscription : septembre 2011
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Localisation : France, Aveyron (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 36
Points : 9
Points : 9
Merci pour t'as réponse, mais je ne pensé pas faire comme ceci, il n'y aurais pas moyen de détecter un espace sur une chaîne de caractères et ainsi de l'affecter à 2 variables ou plus suivant le nombres d'espace ?!
Dewey12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 13h33   #5
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 805
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 805
Points : 3 003
Points : 3 003
Bonjour,

Citation:
Envoyé par Dewey12 Voir le message
il n'y aurais pas moyen de détecter un espace sur une chaîne de caractères et ainsi de l'affecter à 2 variables ou plus suivant le nombres d'espace ?!
Tab(Mots = Split(Reponse, " ")
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 15h01   #6
Invité régulier
 
Homme Cédric
Étudiant
Inscription : septembre 2011
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Localisation : France, Aveyron (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 36
Points : 9
Points : 9
Citation:
Envoyé par pc75 Voir le message
Tab(Mots = Split(Reponse, " ")
Pc75 peux-tu développer un peu car je ne comprend pas tout la ^^
J'ai regardé ailleurs mais je trouve rien concernant ton code !

merci d'avance
Dewey12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 15h14   #7
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 805
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 805
Points : 3 003
Points : 3 003
Re,

La fonction Split() retourne un tableau des mots dans une chaine avec comme séparateur un espace.

Essaie ça :

Code :
1
2
3
4
5
6
 
Reponse = "joint torique diamètre 45"
Tab(Mots = Split(Reponse, " ")
for i = 0 to ubound(Tab) - 1
   msgbox TabMot(i)
next
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/01/2012, 15h57   #8
Invité régulier
 
Homme Cédric
Étudiant
Inscription : septembre 2011
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Localisation : France, Aveyron (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 36
Points : 9
Points : 9
Question : Que faut-il déclarer comme variable exactement et en quoi? (string, ....)

Merci de ton aide en tout cas
Dewey12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 16h27   #9
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 805
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 805
Points : 3 003
Points : 3 003
Re,

Je remets le code, car j'ai mis une parenthèse en trop et j'ai merdé dans le nom des variables:

Code :
1
2
3
4
5
6
 
Reponse = "joint torique diamètre 45"
TabMots = Split(Reponse, " ")
for i = 0 to ubound(TabMots) - 1
   msgbox TabMots(i)
next
Reponse est un string et TabMots est un array
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/01/2012, 16h40   #10
Invité régulier
 
Homme Cédric
Étudiant
Inscription : septembre 2011
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Localisation : France, Aveyron (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 36
Points : 9
Points : 9
Toujours pas
Voici mon code :

Code :
1
2
3
4
5
6
7
8
Dim Reponse As String
Dim TabMots(2) As String
 
Reponse = "joint torique diamètre 45"
TabMots = Split(Reponse, " ")
For i = 0 To UBound(TabMots) - 1
   MsgBox TabMots(i)
Next
Je suis pas encore très à l'aise avec ce langage !!

EDIT : l'erreur est : erreur de compilation ; sub ou function non défini
puis le mot "split" deviens surligné !
Dewey12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 16h46   #11
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 805
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 805
Points : 3 003
Points : 3 003
Re,

Code :
1
2
3
4
5
6
7
8
9
10
 
 
Dim Reponse As String
Dim TabMots() As String
 
Reponse = "joint torique diamètre 45"
TabMots = Split(Reponse, " ")
For i = 0 To UBound(TabMots)
   MsgBox TabMots(i)
Next
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 17h04   #12
Invité régulier
 
Homme Cédric
Étudiant
Inscription : septembre 2011
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Localisation : France, Aveyron (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 36
Points : 9
Points : 9
Apparemment Split et Acess 97 ne sont pas compatibles !
Par contre cette fonction pourrait faire la même chose :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Public Function fSplit(strSplit As String, strSep As String) As Variant
 
Dim L%, nb%, p%
Dim strResult As String
Dim varResult() As Variant
 
If IsNull(strSplit) Then
    fSplit = Null
Else
    strResult = strSplit
    L = Len(strSep)
    p = InStr(1, strSplit, strSep)
    If p = 0 Then
        fSplit = strSplit
    Else
    Do While p > 0
        nb = nb + 1
        ReDim Preserve varResult(nb)
        varResult(nb - 1) = Left(strResult, p - 1)
        strResult = Mid(strResult, p + L)
        p = InStr(1, strResult, strSep)
        If p = 0 Then varResult(nb) = strResult
    Loop
    fSplit = varResult()
    End If
End If
 
End Function
Après comment on l'utilise reste un grand dilemme pour une personne comme moi

EDIT :
Utilisation (trouver sur le site ^^) :

Code :
1
2
Dim T As Variant
T=FctSplit("Bonjour Monsieur Dupont"," ")
Je teste ça demain et je te tiens au courant
Dewey12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 08h42   #13
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 805
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 805
Points : 3 003
Points : 3 003
Re,

J'ignorais que la fonction Split était incompatible avec Acess 97.

Mais tu peux effectivement utiliser la fonction que tu as postée :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
Public Function fSplit(strSplit As String, strSep As String) As Variant
 
Dim L%, nb%, p%
Dim strResult As String
Dim varResult() As Variant
 
If IsNull(strSplit) Then
    fSplit = Null
Else
    strResult = strSplit
    L = Len(strSep)
    p = InStr(1, strSplit, strSep)
    If p = 0 Then
        fSplit = strSplit
    Else
    Do While p > 0
        nb = nb + 1
        ReDim Preserve varResult(nb)
        varResult(nb - 1) = Left(strResult, p - 1)
        strResult = Mid(strResult, p + L)
        p = InStr(1, strResult, strSep)
        If p = 0 Then varResult(nb) = strResult
    Loop
    fSplit = varResult()
    End If
End If
 
End Function
 
 
Dim Reponse As String
Dim TabMots() As String
 
Reponse = "joint torique diamètre 45"
TabMots = fSplit(Reponse, " ")
For i = 0 To UBound(TabMots)
   MsgBox TabMots(i)
Next
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 10h14   #14
Invité régulier
 
Homme Cédric
Étudiant
Inscription : septembre 2011
Messages : 36
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Localisation : France, Aveyron (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 36
Points : 9
Points : 9
C'est bon ça fonctionne :
je donne des fois que cela serve a quelqu'un d'autre.

La procédure de traitement :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ublic Function FctSplit(ByVal strg As String, Sep As String) As Variant
 
Dim i As Integer
    Dim TblSplit() As String
    i = 1
    While InStr(1, strg, Sep) <> 0
        ReDim Preserve TblSplit(i)
        TblSplit(i - 1) = Left(strg, InStr(1, strg, Sep) - 1)
        strg = Mid(strg, InStr(1, strg, Sep) + Len(Sep))
        i = i + 1
    Wend
    If Len(strg) > 0 Then
        ReDim Preserve TblSplit(i - 1)
        TblSplit(i - 1) = strg
    End If
    FctSplit = TblSplit
End Function

L'appel à la procédure (merci pc75 pour ton bout de code) :
Code :
1
2
3
4
5
6
Dim TabMots As Variant
Dim i As Integer
TabMots = FctSplit(Texte2.Value, " ")
For i = 0 To UBound(TabMots)
   MsgBox TabMots(i)
Next
Encore merci
Dewey12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h01.


 
 
 
 
Partenaires

Hébergement Web