[Déplacé VB6 --> VBA] code vba pour trouver touts les mots dans access à partir

Signaler
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010
-
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010
-
Bonjour
Je veux faire une fonction Recherche dans un userform. Je n'arrive qu'à trouver les mots exacts.
Set re bds.OpenRecordset("SELECT `Dénomination` FROM `Produits` WHERE `Dénomination` '" & UCase(Textbox1) & "' ;")


Il faut mettre des étoiles "*" mais je ne sais pas où...
Si vous pouviez m'aider^^ Merci

23 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Salut
Le langage SQL utilise des % et non des * et, dans ce cas, il faut utiliser Like et non =.
"... WHERE `Dénomination` Like '%
" & UCase(Textbox1) & "%
'")

+ Pas de ` dans l'encadrement des noms de champ. D'où sors-tu cette idée ?
Si le nom du champ (ou table) possède des caractères spéciaux (accents, espaces, ...), il faut encadrer ces noms avec des crochets [ et ]
"... WHERE [Dénomination] Like '%" & UCase(Textbox1) & "%'")

Attention à l'utilisation de UCase qui peut masquer certains résultats.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010

Je ne comprends pas, ça ne marche toujours pas.
En tout cas merci pour toutes ces précisions car je débute et suis un peu perdu^^"
Petite question: quels résultats peuvent être masqués par UCase?
Ça m'embêterait de me faire avoir.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
quels résultats peuvent être masqués par UCase?


si tu as dans ta base :

DRAGON
Dragée
Rat

et que tu cherche %RA%
tu ne recevra que le premier tuple (DRAGON)

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
"ça ne marche pas" n'est pas une explication valable.
Comment sais-tu que ça ne marche pas ?
As-tu une erreur ou bien le RecordSet ne compte aucun résultat ?
Que vaut ta TextBox1 au moment du test ?
As-tu vérifier qu'il existe bien au moins une donnée correspondante ? exemple

Copie/colle ton code afin de vérifier que tu as bien corrigé ton code
Copie/colle aussi la définition (Dim) de tes object comme 're'

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010

Donc voici ma ligne avec les %:

Set re = bds.OpenRecordset("SELECT [Dénomination] FROM [Produits] WHERE [Dénomination] LIKE '%" & Textbox1 & "%';")

J'ai un message d'erreur: "Aucun enregistrement trouvé"

Dans ma base, j'ai les produits lou et loulou.
Si j'enlève les %, le code marche et je trouve les noms exacts.
Si je tape lou dans la textbox1, j'obtiens lou dans ma listbox or je voudrais obtenir lou et loulou.

Pour les déclarations:
Dim re As Recordset, re2 As Recordset

Merci!
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010

J'ai oublié: quelle fonction mettre pour obtenir DRAGON,Dragée et Rat?
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
Bonjour

Je crois que tu viens de trouver loulou c'est moi! malheureusement cela ne t'apporte pas la solution

Ta requete me semble bien avec les %

Le code 'loulou' n'est t'il pas dans un deuxième champ de la table 'Produits' autre que le champ 'désignation' (ex: code_produit)

Si tu produisais la structure de la table et de ses enregistrements, cela enlèverai une ambiguité
La base de données c'est Access, SQL Server, My SQL , ...?
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010

^^ Ba je trouve lou et loulou sans les % donc ils sont bien présents dans champ Dénomination tous les 2. La base de données est sur Access.
Je n'ai pas compris ce que tu entends par produire le structure de la table et de ses enregistrements.



Voila.
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
sachant aussi que c'est une base access

select [Dénomination] FROM [Produits] WHERE UCase([Dénomination]) LIKE '" & Ucase(Textbox1.Text) & "';")

avec ou sans les % je ne connais pas la réaction d'access je travaille sur SQL Server

la fonction de mise en majucule est UPPER alors que cà a l'air d'etre UCase pour access
Alors la condition Where que je verrai est

Ucase(Champ)= UCase(champ de formulaire saisi) comme ci-dessus
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Ca devrait fonctionner.

"J'ai un message d'erreur: "Aucun enregistrement trouvé" " Sur quelle ligne ? Quel code d'erreur (n°) ?
Si c'est un MsgBox perso, comment fais-tu pour l'afficher, quel test ?

Quel est ta définition de 're', quel 'Dim' as-tu fais ?

Pour être sûr que ta syntaxe est bonne, tu vas nous montrer la requète telle qu'elle sera présentée à l'instruction lorsque tu mets 'lou' dans ta TextBox :
Dim sTemp As String
sTemp = "SELECT [Dénomination] FROM [Produits] WHERE [Dénomination] LIKE '%" & Textbox1 & "%'"
Debug.Print sTemp  ' Colle nous le texte généré dans la fenêtre de debug)
Set re = bds.OpenRecordset(sTemp)
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010

Erreur 3021: aucun enregistrement trouvé
Il m'indique que l'erreur est à la ligne "re.MoveFirst"
Même chose avec sTemp.
Dim re As Recordset


Set bds = OpenDatabase("F:\Users\Romain\Desktop\Management\Base de données.mdb")
Set re = bds.OpenRecordset("SELECT [Dénomination] FROM [Produits] WHERE [Dénomination] LIKE '%" & Textbox1 & "%';")

re.MoveFirst
n = 0

Do While Not re.EOF
    ListProd.AddItem re.Fields("Dénomination").Value
    re.MoveNext
    n = n + 1
Loop
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
effectivement la requete ne passe pas

vérifier que les objets sont bien déclarés
Dim dbs as DAO.Database
dim re as DAO.Recordset

avant de faire un movefirst tester si l'objet Recordset est bien initialisé
if not re is nothing then
'movefirst and movenext
end if

mettre un traitement d'exception dès le début
ON Error goto etiquette
....traitement
etiquette:
MsgBox err.Description
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010

Avec etiquette j'ai le message "Aucun enregistrement en cours"

J'ai aussi essayer:
If Not re Is Nothing Then
    re.MoveFirst
    n = 0
Else
    Message = MsgBox("Il n'y a aucun résultat.", vbExclamation + vbOKOnly, "Résultats")
    re.Close
    Exit Sub
End If


Du coup j'ai le message "Il n'y a aucun résultat."

C'est quand même incroyable ça devrait marcher.
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
tu as bien mis les déclarations DAO et pas ADO

si Activex Data Object est une librairie chargé peux tu l'enlever de ton projet et réexécuter


Si tu executes

Set bds = OpenDatabase("F:\Users\Romain\Desktop\Management\Base de données.mdb")
Set re = bds.OpenRecordset("Produits", dbOpenTable)

Observes si tu éxécutes le MoveFirst normalement?

il y a d'autres paramètres à OpenDatabase et OpenRecordset : regardes le tutorial
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010

Alors, en mettant Set re = bds.OpenRecordset("Produits", dbOpenTable)
Ma Listbox m'affiche tous mes produits.
Le MoveFirst fonctionne donc.
Il ne reconnait plus bds si je désactive Microsoft Activex Data Object
Merci pour ton aide
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Remettons les choses dans l'ordre et, par pitié, répond aux questions qu'on te pose (à porpos des Dim); on va pas y passer le réveillon ! (bien placé, non ?)

La base de données est sous Access. Ok.
Mais confirme-nous que tu travailles dans le VBA de Access, parce que tu n'en as rien dit.
Cela peut changer les méthodes.

Le test avec sTemp n'était pas pour faire fonctionner la requète, mais pour que tu nous montres la tête de la requète telle qu'elle est soumise au moteur.

Avant de faire un .MoveFirst ou tout autre ordre, il faut tester .RecordCount, d'où l'erreur.

Comme tu ne nous dis toujours pas comment sont dimensionnées tes variablesdbs comme re, on va supposer que tu utilises DAO.
DAO est obsolète, dépassé, périmé.
Il faut utiliser ADO, par exemple ADODB.
C'est le moteur qui te permettra d'interfacer avec tes données. Autant utiliser un moteur performant et compatible avec les systèmes Windows modernes !
Si besoin, ajouter la référence à "Microsoft ActiveX Data Objects 2.8 Library".

Exemple d'un RecordSet ADODB :
    Dim monRS As ADODB.Recordset
    Set monRS = New ADODB.Recordset
    With monRS
        .CursorLocation = adUseClient
        .Open "Select * From maTable", , adOpenStatic, adLockReadOnly
        If .RecordCount > 0 Then
            .MoveFirst
            Do While Not .EOF
                Debug.Print .Fields(0).Name, .Fields(0).Value
                .MoveNext
            Loop
        End If
        .Close
    End With

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
120
Date d'inscription
jeudi 2 août 2007
Statut
Membre
Dernière intervention
11 juin 2010

Alors je travail dans le VBA de Excel. (Je dois remplir des tableaux)

Je vous copie mes déclarations:
Dim bds As DAO.Database
Dim re As DAO.Recordset, re2 As DAO.Recordset
Dim champ As Field


Du coup comment je dois déclarer bds en ADO. Parce que j'ai mis "Dim bds As ADODB.Database"
Et il me met le message erreur : "Type défini par l'utilisateur non défini"

Mon code entier:

Private Sub Rechercher_Click()

  Dim bds As ADODB.Database

  Dim monRS As ADODB.Recordset
  
  Set bds = OpenDatabase("F:\Users\Romain\Desktop\Management\Base de données.mdb")

    Set monRS = New ADODB.Recordset
    With monRS
        .CursorLocation = adUseClient
        .Open "Select * From Produits", , adOpenStatic, adLockReadOnly
        If .RecordCount > 0 Then
            .MoveFirst
            Do While Not .EOF
                Debug.Print .Fields(0).Name, .Fields(0).Value
                .MoveNext
            Loop
        End If
        .Close
    End With


End Sub


"Le test avec sTemp n'était pas pour faire fonctionner la requète, mais pour que tu nous montres la tête de la requète telle qu'elle est soumise au moteur."
Là, je ne comprends pas ce que je dois montrer...un code vba?
Je débute je suis donc un peu lent^^"

Je vous remercie pour votre patience
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Non, tu n'as qu'une connexion à faire à ta base Access.

Dim maConnexion As ADODB.Connection
Set maConnexion =  New ADODB.Connection
maConnexion.ConnectionString = _
   "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Persist Security Info=False;" & _
   "Data Source=" & "C:\mon répertoire\monFichier.MDB"
maConnexion.Open ' Ouvre la connexion.


Ensuite, les fonctions comme monRS.Open auront besoin de connaitre le nom de l'objet de connexion, exemple :
monRS.Open "Select * From maTable", maConnexion , adOpenStatic, adLockReadOnly

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Pour sTemp :
Je t'ai fait rajouter une ligne Debug.Print sTemp
Cela recopie le contenu de la variable dans la fenêtre de debug (Ctrl-G)
Je voulais simplement que tu recopie ce texte ici : Ce sera ta requète, incluant le texte de la TextBox, histoire de vérifier qu'il n'y a pas de problème de ce côté là.
Mais Loulou69 (que je salue au passage) à donné l'info principale : Cela ne semble pas fonctionner chez lui non plus. Le problème vient donc du moteur de connexion.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)