Il y a quelque temps, j'avais sollicité votre aide pour rechercher un enregistrement dans une table Access depuis Excel.
Code:
For i = 0 To ListBox2.ListCount - 1
Rst.MoveFirst
Rst.Find ("[Numéro de raquette]='" & Mid(ListBox2.List(i), 1, InStr(1, ListBox2.List(i), " -") - 1) & "'")
Next i
Me revoilà de nouveau avec un problème dans cette recherche. En effet, la base de données n'étant pas été correctement renseignée, je me retrouve avec des produits qui ont le même numéro pour des noms différents.
Est-il possible d'effectuer une recherche sur le modèle précédent en s'appuyant sur deux champs, le numéro et le nom du produit ?
Sub ImportHisto()
Dim BD As Database
Dim Histo As Recordset
Dim x As Workbook
Dim f As Worksheet
Set x = Workbooks("Fichier.xls")
Set f = x.Worksheets("Histo")
Set BD = OpenDatabase("path/Fichier.mdb")
Set Histo = BD.OpenRecordset("Table")
'Recherche sur la clé primaire
Histo.Index = "PrimaryKey"
Histo.Seek "=", f.Range("plage nommée qui correspond aux données de ta clé primaire")
If Histo.NoMatch Then
MsgBox ("Il n'y a pas d'enregistrement pour" & f.Range("plage nommée qui correspond aux données de ta clé primaire"))
Histo.Close
GoTo fin
Else
f.Range("Range1") = Histo![Champ de la BD]
f.Range("Range2") = Histo![Champ de la BD]
End If
Histo.Close
Histo=nothing
BD=nothing
End Sub
Tu n'as qu'à nommer tes champs dans Excel et ça devrait marcher.
Je ne suis pas sûr d'avoir correctement expliqué mon problème ou d'avoir compris ton code...
En fait dans ma table Access, j'ai plusieurs enregistrements avec pour chacun d'eux plusieurs champs : Ch1, Ch2, Ch3... Ch25.
Chaque enregistrement a bien une clé primaire mais je ne peux pas effectuer la recherche sur cette clé primaire car elle n'est pas explicite du tout. Je dois donc rechercher un enregistrement en me basant sur d'autre(s) champs.
Le Ch1 correspond à un numéro de produit et le Ch2 à un nom de produit. Le hic, c'est que la base n'a pas été correctement remplie initiallement. Il y a donc des enregistrements ayant les mêmes numéros. Je veux donc effectuer une recherche sur deux champs, le numéro et le nom.
Si tu as accès à ta base pourquoi ne pas créer un champ calculé égal à la concaténation de N° de produit et de son nom ? si tu n'y a pas accès, ADO permet de le créer sans trop de pb
Ensuite, plutôt que d'employer "find" on utiliserait SQL
"SELECT teschampsvoulus FROM tatable WHERE lechampcalculé = tonexpressionexcel;"
En fait, à partir de ma base access et de ces deux champs, j'alimente une listbox dont chaque élément est la concaténation des deux champs de ma base.
Lorsque l'utilisateur sélectionne un élément dans la listbox, il faut que je "retrouve" l'élément dans la table Access. D'où ma recherche sur les deux champs dont je connais la valeur.
J'ai tenté de passer par du SQL mais je suis limité...
Code:
Rst.Open "SELECT * FROM [Liste des raquettes] WHERE [Numéro de raquette]= Mid(ListBox2.List(i), 1, InStr(1, ListBox2.List(i), " - ")-1) AND [Numéro lay up ou nom]=Mid(ListBox2.List(i), InStr(1, ListBox2.List(i), " - ") + 3)"
Cela revient à
Code:
Rst.Open "SELECT * FROM [Liste des raquettes] WHERE [Numéro de raquette]= Numéro AND [Numéro lay up ou nom]=Nom raq"
J'ai du comettre quelques erreurs. J'ai pourtant vérifié les valeurs renvoyées par la fonction Mid et elles correspondent. Celà doit venir d'une erreur de syntaxe...
Désolé pour le dérangement et encore merci pour votre aide
Bonjour, Rapidos car je suis au boulot: Si ce n'est pas une faute de frappe dans ton message, SQL n'aime pas du tout les espaces voir: "nom raq" à la fin de ton instruction SQL En espèrant que...
Bonjour le forum, michel_m et merci pour la rapidité de ta réponse,
En fait, je me suis raté, j'ai bien pensé à ne pas mettre d'espace... Par contre du fait d'erreur, j'ai du modifier quelque peu mon code
Voici la dernière version (qui ne marche pas...) :
Code:
Rst.Open "SELECT * FROM [Liste des raquettes] WHERE [Numéro de raquette]= NumeroRaquette AND [Numéro lay up ou nom]=NomRaquette", Conn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
J'ai une erreur m'indiquant qu'il n'y a pas assez de paramètres !!!
ci joint un petit exemple basique où il faut que 2 champs soient identiques aux données excel pour extraire la ligne
Il s'agit de 2 champs texte qui doivent donc être encadrés par des apostrophes, apostrophes non utiles s'il s'agit d'une valeur numérique. d'après ce que j'ai cru comprendre de tes messages, jai considéré que les valeurs excel sont inscrites en variable (nom_raquette?)
Je te remercie grandement pour le temps que tu me consacres, c'est vraiment super sympa. J'ai essayé de reproduire ton exemple dans mon fichier mais je bute toujours...
Si ça ne te gêne pas trop, j'ai simplifié mon fichier et ma base de données pour pouvoir les joindre dans ce post. Si tu veux y jeter un coup d'oeil, j'en serais ravi ! YouSendIt: The Leader in File Delivery.
De mon côté, je vais continuer à explorer les mystères d'Excel.
NumeroRaquette = Mid(ListBox2.List(i), 1, InStr(1, ListBox2.List(i), " - ") - 1) renvoie une variable type string dans la base on a pour ce champ une valeur numérique/
Pour transformer en numérique Essaies : NumeroRaquette = val(Mid(ListBox2.List(i), 1, InStr(1, ListBox2.List(i), " - ") - 1))/
D’autre part, après cette transformation en numérique, numeroraquette est une variable donc il faut bidouiller le texte SQL: / texte_SQL = "SELECT * FROM R_Liste_raq WHERE [Numéro de raquette]= NumeroRaquette AND [Numéro lay up ou nom]='" & NomRaquette & "';"/
devient/ texte_SQL = "SELECT * FROM R_Liste_raq WHERE [Numéro de raquette]= " & NumeroRaquette & "AND [Numéro lay up ou nom]='" & NomRaquette & "';"/ / a mon avis, il n'était ^pas nécessaire de créer une requête Access (R_liste_raq), tu peux sélectionner sur la table (dans mon exemple, c'était nécessaire car données dans plusieurs tables avec clés étrangères)