Rechercher un mot clé dans une table

Le
codial
Re bonjour ;-)

Voilà je cherche une solution pour rechercher dans tous les champs un mot
dans un sous form en mode Feuille de données, j'ai essayé le bouton
Recherche enregistrement d'Access pour afficher le form "Recherche" mais
apparemment ça ne marche pas pour un sous form!

Et je rejoinds ma précédente question, comment faire pour lancer un état
avec le résultat d'un filtre!

Cordialement

Codial
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Eric
Le #5370921
Bonsoir Codial

"codial"

Voilà je cherche une solution pour rechercher dans tous les champs un
mot

dans un sous form en mode Feuille de données, j'ai essayé le bouton
Recherche enregistrement d'Access pour afficher le form "Recherche"
mais

apparemment ça ne marche pas pour un sous form! Si ca marche


Si ca marche !!!


Je ne sais pas si la solution que je te propose te conviendra mais
sait-on jamais.

J'ai construit un formulaire contenant une zone de texte appelée Texte0
et 3 boutons cmdSearch, cmdSearchNext et cmdSearchPrevious. Dans ce
formulaire j'ai inséré un autre formulaire en mode feuille de données
contenant plusieurs champs. L'objectif est de rechercher dans le sous-
formulaire les champs contenant le mot saisi dans la zone de texte0. Je
t'avoue que j'ai écris la procédure pour tester tous les champs mais dans
mon exemple, un seul pouvait contenir le mot saisi, les autres contenant
des valeurs numériques. Donc à toi de tester dans ton cas de figure pour
t'assurer que ca marche.


Le code est le suivant ( à améliorer mais c'est une piste de réflexion)

Dans la partie déclarative du module de formulaire :
Dim Position As Long, varBookMark As Variant, rs As Recordset
Dim fld As Field, ctl As Control

Les procédures sur les boutons:
-------------------------------

Private Sub cmdSearch_Click()
If IsNull(Texte0) Then
MsgBox "Saisie Obligatoire"
Texte0.SetFocus
Exit Sub
End If
'Nom du sous-formulaire de test :ArticlePairImpair
Set rs = Me.ArticlePairImpair.Form.RecordsetClone
rs.MoveFirst
DoCmd.GoToControl "ArticlePairImpair"
While Not rs.EOF
For Each fld In rs.Fields
If fld.Value Like "*" & Texte0 & "*" Then
Position = rs.AbsolutePosition + 1
Set ctl = Me.ArticlePairImpair(fld.Name)
DoCmd.GoToRecord acActiveDataObject, , acGoTo, Position
DoCmd.GoToControl ctl.Name: Exit Sub
End If
Next fld
rs.MoveNext
Wend
End Sub

Private Sub cmdSearchNext_Click()
Set rs = Me.ArticlePairImpair.Form.RecordsetClone
DoCmd.GoToControl "ArticlePairImpair"
rs.Move 1 ' on descend dans le jeu
While Not rs.EOF
For Each fld In rs.Fields
If fld.Value Like "*" & Texte0 & "*" Then
Position = rs.AbsolutePosition + 1
Set ctl = Me.ArticlePairImpair(fld.Name)
DoCmd.GoToRecord acActiveDataObject, , acGoTo, Position
DoCmd.GoToControl ctl.Name
varBookMark = rs.Bookmark
Exit Sub
End If
Next fld
rs.MoveNext
Wend
If rs.EOF Then
rs.Bookmark = varBookMark
MsgBox "Recherche Terminée !"
Else
Position = rs.AbsolutePosition + 1
End If
End Sub

Private Sub cmdSearchPrevious_Click()
Set rs = Me.ArticlePairImpair.Form.RecordsetClone
DoCmd.GoToControl "ArticlePairImpair"
rs.Move -1 ' on remonte
While Not rs.BOF
For Each fld In rs.Fields
If fld.Value Like "*" & Texte0 & "*" Then
Position = rs.AbsolutePosition + 1
Set ctl = Me.ArticlePairImpair(fld.Name)
DoCmd.GoToRecord acActiveDataObject, , acGoTo, Position
DoCmd.GoToControl ctl.Name
varBookMark = rs.Bookmark
Exit Sub
End If
Next fld
rs.MovePrevious
Wend
If rs.BOF Then
rs.Bookmark = varBookMark
MsgBox "Recherche Terminée !"
Else
Position = rs.AbsolutePosition + 1
End If
End Sub


Voila

A+
Eric

Eric
Le #5370871
re,

il te faudra rajouter dans la procédure cmdSearch_Click() :
varBookMark = rs.Bookmark
après l'instruction DoCmd.GoToControl ctl.Name
sinon tu as une erreur si le mot n'apparait qu'une seule fois dans le jeu
d'enregistrement.

Précisions: ca plante si tu fais une recherche sur des nombres, pas à
tous les coups mais ca plante.

Enfin, il t'appartiendra de gérer les autres champs car par les boutons
Next et Previous je me déplace dans le jeu en avant ou en arrière mais
pas sur les champs de l'enregistrement. Par contre ca fonctionne sur
n'importe quel champ d'un enregistrement dès lors qu'on n'a pas trouvé
une occurence du mot cherché dans les champs précédents de
l'enregistrement en cours.

A+
Eric



Private Sub cmdSearch_Click()
If IsNull(Texte0) Then
MsgBox "Saisie Obligatoire"
Texte0.SetFocus
Exit Sub
End If
'Nom du sous-formulaire de test :ArticlePairImpair
Set rs = Me.ArticlePairImpair.Form.RecordsetClone
rs.MoveFirst
DoCmd.GoToControl "ArticlePairImpair"
While Not rs.EOF
For Each fld In rs.Fields
If fld.Value Like "*" & Texte0 & "*" Then
Position = rs.AbsolutePosition + 1
Set ctl = Me.ArticlePairImpair(fld.Name)
DoCmd.GoToRecord acActiveDataObject, , acGoTo, Position
DoCmd.GoToControl ctl.Name: Exit Sub
End If
Next fld
rs.MoveNext
Wend
End Sub



codial
Le #5370761
Bonjour Eric,

Merci pour cette réponse je vais tester ça aujourd'hui et je te tiens au
courant du résultat
a++

Codial


"Eric" news:

re,

il te faudra rajouter dans la procédure cmdSearch_Click() :
varBookMark = rs.Bookmark
après l'instruction DoCmd.GoToControl ctl.Name
sinon tu as une erreur si le mot n'apparait qu'une seule fois dans le jeu
d'enregistrement.

Précisions: ca plante si tu fais une recherche sur des nombres, pas à
tous les coups mais ca plante.

Enfin, il t'appartiendra de gérer les autres champs car par les boutons
Next et Previous je me déplace dans le jeu en avant ou en arrière mais
pas sur les champs de l'enregistrement. Par contre ca fonctionne sur
n'importe quel champ d'un enregistrement dès lors qu'on n'a pas trouvé
une occurence du mot cherché dans les champs précédents de
l'enregistrement en cours.

A+
Eric



Private Sub cmdSearch_Click()
If IsNull(Texte0) Then
MsgBox "Saisie Obligatoire"
Texte0.SetFocus
Exit Sub
End If
'Nom du sous-formulaire de test :ArticlePairImpair
Set rs = Me.ArticlePairImpair.Form.RecordsetClone
rs.MoveFirst
DoCmd.GoToControl "ArticlePairImpair"
While Not rs.EOF
For Each fld In rs.Fields
If fld.Value Like "*" & Texte0 & "*" Then
Position = rs.AbsolutePosition + 1
Set ctl = Me.ArticlePairImpair(fld.Name)
DoCmd.GoToRecord acActiveDataObject, , acGoTo, Position
DoCmd.GoToControl ctl.Name: Exit Sub
End If
Next fld
rs.MoveNext
Wend
End Sub







codial
Le #5370511
Salut Eric

Ok ça marche très bien merci beaucoup

Pour affiner j'ai créer un bouton pour essayer de filtrer sur la première
occurence trouvée mais je ne vois pas bien le code à y mettre!!

Si tu as une idée je suis preneur!

Mais encore merci

Amicalement
Codial


"Eric" news:

re,

il te faudra rajouter dans la procédure cmdSearch_Click() :
varBookMark = rs.Bookmark
après l'instruction DoCmd.GoToControl ctl.Name
sinon tu as une erreur si le mot n'apparait qu'une seule fois dans le jeu
d'enregistrement.

Précisions: ca plante si tu fais une recherche sur des nombres, pas à
tous les coups mais ca plante.

Enfin, il t'appartiendra de gérer les autres champs car par les boutons
Next et Previous je me déplace dans le jeu en avant ou en arrière mais
pas sur les champs de l'enregistrement. Par contre ca fonctionne sur
n'importe quel champ d'un enregistrement dès lors qu'on n'a pas trouvé
une occurence du mot cherché dans les champs précédents de
l'enregistrement en cours.

A+
Eric



Private Sub cmdSearch_Click()
If IsNull(Texte0) Then
MsgBox "Saisie Obligatoire"
Texte0.SetFocus
Exit Sub
End If
'Nom du sous-formulaire de test :ArticlePairImpair
Set rs = Me.ArticlePairImpair.Form.RecordsetClone
rs.MoveFirst
DoCmd.GoToControl "ArticlePairImpair"
While Not rs.EOF
For Each fld In rs.Fields
If fld.Value Like "*" & Texte0 & "*" Then
Position = rs.AbsolutePosition + 1
Set ctl = Me.ArticlePairImpair(fld.Name)
DoCmd.GoToRecord acActiveDataObject, , acGoTo, Position
DoCmd.GoToControl ctl.Name: Exit Sub
End If
Next fld
rs.MoveNext
Wend
End Sub







Eric
Le #5370471
Bonjour Codial,

"codial"
Pour affiner j'ai créer un bouton pour essayer de filtrer sur la
première occurence trouvée mais je ne vois pas bien le code à y
mettre!!

Si tu as une idée je suis preneur!



Je ne vois pas trop ce que tu veux faire avec ce bouton.
Quand tu as trouvé une occurence, tu veux mettre un filtre sur le jeu
d'enregistrements pour ne voir que les enregistrements correspondant à
l'occurence (qui peut se trouver dans n'importe quel champ) et masquer les
autres lignes. C'est ca ?

a+
Eric

codial
Le #5370441
Re

oui c'est ça, mais j'ai trouvé!

On Error Resume Next
Set ctl = Me.sfrm_Recherche(fld.Name)
Me.sfrm_Recherche.Form.Filter = "[" & ctl.Name & "] = '" & ctl & "'"
Me.sfrm_Recherche.Form.FilterOn = True

et ça à l'air de marcher, je teste

Encore merci

Codial




"Eric" news:
Bonjour Codial,

"codial"
Pour affiner j'ai créer un bouton pour essayer de filtrer sur la
première occurence trouvée mais je ne vois pas bien le code à y
mettre!!

Si tu as une idée je suis preneur!



Je ne vois pas trop ce que tu veux faire avec ce bouton.
Quand tu as trouvé une occurence, tu veux mettre un filtre sur le jeu
d'enregistrements pour ne voir que les enregistrements correspondant à
l'occurence (qui peut se trouver dans n'importe quel champ) et masquer les
autres lignes. C'est ca ?

a+
Eric



codial
Le #5370431
re

mais ça ne marche qu'une fois!!

codial

"Eric" news:
Bonjour Codial,

"codial"
Pour affiner j'ai créer un bouton pour essayer de filtrer sur la
première occurence trouvée mais je ne vois pas bien le code à y
mettre!!

Si tu as une idée je suis preneur!



Je ne vois pas trop ce que tu veux faire avec ce bouton.
Quand tu as trouvé une occurence, tu veux mettre un filtre sur le jeu
d'enregistrements pour ne voir que les enregistrements correspondant à
l'occurence (qui peut se trouver dans n'importe quel champ) et masquer les
autres lignes. C'est ca ?

a+
Eric



Eric
Le #5370391
re,
N'oublies pas de virer ton filtre à chaque fois que tu renseignes le
champ Texte car faut réinitialiser le jeu d'enregistrements.
Me.sfrm_Recherche.Form.FilterOn = False. De plus lors de la prochaine
recherche tu ne feras pas forcément appel au même champ retourné par
ctl.name.
Bon, je te laisse aller plus avant
A+
Eric


"codial" news::

re

mais ça ne marche qu'une fois!!

codial

"Eric" news:
Bonjour Codial,

"codial"
Pour affiner j'ai créer un bouton pour essayer de filtrer sur la
première occurence trouvée mais je ne vois pas bien le code à y
mettre!!

Si tu as une idée je suis preneur!



Je ne vois pas trop ce que tu veux faire avec ce bouton.
Quand tu as trouvé une occurence, tu veux mettre un filtre sur le jeu
d'enregistrements pour ne voir que les enregistrements correspondant
à l'occurence (qui peut se trouver dans n'importe quel champ) et
masquer les autres lignes. C'est ca ?

a+
Eric







codial
Le #5370381
Ok merci pour le conseil!
je suis en train de chercher comment faire pour me déplacer sur les champs
de l'enregistrement!
A+
Codial


"Eric" news:
re,
N'oublies pas de virer ton filtre à chaque fois que tu renseignes le
champ Texte car faut réinitialiser le jeu d'enregistrements.
Me.sfrm_Recherche.Form.FilterOn = False. De plus lors de la prochaine
recherche tu ne feras pas forcément appel au même champ retourné par
ctl.name.
Bon, je te laisse aller plus avant
A+
Eric


"codial" news::

re

mais ça ne marche qu'une fois!!

codial

"Eric" news:
Bonjour Codial,

"codial"
Pour affiner j'ai créer un bouton pour essayer de filtrer sur la
première occurence trouvée mais je ne vois pas bien le code à y
mettre!!

Si tu as une idée je suis preneur!



Je ne vois pas trop ce que tu veux faire avec ce bouton.
Quand tu as trouvé une occurence, tu veux mettre un filtre sur le jeu
d'enregistrements pour ne voir que les enregistrements correspondant
à l'occurence (qui peut se trouver dans n'importe quel champ) et
masquer les autres lignes. C'est ca ?

a+
Eric










codial
Le #5370371
En fait en réfléchissant ce qui serait interessant c de pouvoir garder le
premier filtre pour l'affiner au fur et à mesure!

Codial

"Eric" news:
re,
N'oublies pas de virer ton filtre à chaque fois que tu renseignes le
champ Texte car faut réinitialiser le jeu d'enregistrements.
Me.sfrm_Recherche.Form.FilterOn = False. De plus lors de la prochaine
recherche tu ne feras pas forcément appel au même champ retourné par
ctl.name.
Bon, je te laisse aller plus avant
A+
Eric


"codial" news::

re

mais ça ne marche qu'une fois!!

codial

"Eric" news:
Bonjour Codial,

"codial"
Pour affiner j'ai créer un bouton pour essayer de filtrer sur la
première occurence trouvée mais je ne vois pas bien le code à y
mettre!!

Si tu as une idée je suis preneur!



Je ne vois pas trop ce que tu veux faire avec ce bouton.
Quand tu as trouvé une occurence, tu veux mettre un filtre sur le jeu
d'enregistrements pour ne voir que les enregistrements correspondant
à l'occurence (qui peut se trouver dans n'importe quel champ) et
masquer les autres lignes. C'est ca ?

a+
Eric










Publicité
Poster une réponse
Anonyme