utiliser le résultat d'une requête de recherche dans un calcul en VBA
8 réponses
oualaléreur
Comment faire pour utiliser un champ r=E9sultat d'une requ=EAte de
recherche dans un calcul en VBA ?
Pour l'instant j'utilise ceci, mais ca ne fonctionne pas :
Dim Utilisable As Variant
Dim Rec As DAO.Recordset
Set Rec =3D db.OpenRecordset("Nom_requete")
Utilisable =3D Rec![Champ_selectionn=E9]
Ce code tourne sur chaque ligne d'une table et il renvoie la bonne
valeur la premi=E8re fois, mais apr=E8s c'est soit la m=EAme, soit 0. J'ai
beau rouvrir et fermer Rec pour chaque it=E9ration :
Rec.Close
Set Rec =3D Nothing
Utilisable =3D Null
Je ne r=E9cup=E8re pas la bonne valeur.
Faut-il passer par une table interm=E9diaire ?=20
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Gilbert
Bonjour,
Il faut faire une boucle sur tous les enregistrements de ton recordset Do While not Rec.EOF Utilisable = Rec![Champ_selectionné] . . Rec.MoveNext Loop
Gilbert
"oualaléreur" a écrit dans le message de news: Comment faire pour utiliser un champ résultat d'une requête de recherche dans un calcul en VBA ? Pour l'instant j'utilise ceci, mais ca ne fonctionne pas :
Dim Utilisable As Variant Dim Rec As DAO.Recordset Set Rec = db.OpenRecordset("Nom_requete") Utilisable = Rec![Champ_selectionné]
Ce code tourne sur chaque ligne d'une table et il renvoie la bonne valeur la première fois, mais après c'est soit la même, soit 0. J'ai beau rouvrir et fermer Rec pour chaque itération :
Rec.Close Set Rec = Nothing Utilisable = Null
Je ne récupère pas la bonne valeur. Faut-il passer par une table intermédiaire ?
à +
Benoit
Bonjour,
Il faut faire une boucle sur tous les enregistrements de ton recordset
Do While not Rec.EOF
Utilisable = Rec![Champ_selectionné]
.
.
Rec.MoveNext
Loop
Gilbert
"oualaléreur" <benoit.vrignon@cpe.fr> a écrit dans le message de
news:1138871090.988894.276580@g14g2000cwa.googlegroups.com...
Comment faire pour utiliser un champ résultat d'une requête de
recherche dans un calcul en VBA ?
Pour l'instant j'utilise ceci, mais ca ne fonctionne pas :
Dim Utilisable As Variant
Dim Rec As DAO.Recordset
Set Rec = db.OpenRecordset("Nom_requete")
Utilisable = Rec![Champ_selectionné]
Ce code tourne sur chaque ligne d'une table et il renvoie la bonne
valeur la première fois, mais après c'est soit la même, soit 0. J'ai
beau rouvrir et fermer Rec pour chaque itération :
Rec.Close
Set Rec = Nothing
Utilisable = Null
Je ne récupère pas la bonne valeur.
Faut-il passer par une table intermédiaire ?
Il faut faire une boucle sur tous les enregistrements de ton recordset Do While not Rec.EOF Utilisable = Rec![Champ_selectionné] . . Rec.MoveNext Loop
Gilbert
"oualaléreur" a écrit dans le message de news: Comment faire pour utiliser un champ résultat d'une requête de recherche dans un calcul en VBA ? Pour l'instant j'utilise ceci, mais ca ne fonctionne pas :
Dim Utilisable As Variant Dim Rec As DAO.Recordset Set Rec = db.OpenRecordset("Nom_requete") Utilisable = Rec![Champ_selectionné]
Ce code tourne sur chaque ligne d'une table et il renvoie la bonne valeur la première fois, mais après c'est soit la même, soit 0. J'ai beau rouvrir et fermer Rec pour chaque itération :
Rec.Close Set Rec = Nothing Utilisable = Null
Je ne récupère pas la bonne valeur. Faut-il passer par une table intermédiaire ?
Alors c'est que ta requete ne renvoie qu'un enregistrement. Quel est ton code exactement?
Gilbert
"oualaléreur" a écrit dans le message de news:
Oui oui, c'est bien ce que je fais
oualaléreur
Merci de te pencher sur le problème. Normalement, ma requête ne renvoie qu'un enregistrement en effet, mais elle est sensée être lancée à chaque fois qu'on passe dans la boucle. Ce qui effectivement n'a pas l'air d'être le cas. Voici une partie du code :
Dim Utilisable As Variant Dim rs As DAO.Recordset Set rs = db.OpenRecordset("Table", DB_OPEN_DYNASET)
rs.MoveFirst
Do Until rs.EOF Dim Rec As DAO.Recordset Set Rec = db.OpenRecordset("Requête_Recherche") Utiliseable = Rec![Nom_Champ_Retourné]
SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Table WHERE (((Tbl_HV_Price.Volume)0000) AND ((Tbl_HV_Price.ArticleNumber)=[Table].[ArticlNumber]));
"Table", c'est la même que dans le module, et en écrivant, je me rends compte qu'il y a de fortes chances que le problème vienne du "Articl(e)Number", le champ qui fait le lien entre les deux tables. En effet, j'ai peur que celui-ci n'évolue pas d'une itération à l'autre, or [Table].[ArticlNumber] est sensé suivre le même avancement dans la table que le recordset. Il faudrait soit envoyer un paramètre à la requête ( c'est possible, ca ?), soit pouvoir effectuer la même recherche en VBA dans le module, ce que je ne sais pas faire.
Benoit
Merci de te pencher sur le problème. Normalement, ma requête ne
renvoie qu'un enregistrement en effet, mais elle est sensée être
lancée à chaque fois qu'on passe dans la boucle. Ce qui effectivement
n'a pas l'air d'être le cas. Voici une partie du code :
Dim Utilisable As Variant
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("Table", DB_OPEN_DYNASET)
rs.MoveFirst
Do Until rs.EOF
Dim Rec As DAO.Recordset
Set Rec = db.OpenRecordset("Requête_Recherche")
Utiliseable = Rec![Nom_Champ_Retourné]
SELECT Tbl_HV_Price.PricePP
FROM Tbl_HV_Price, Table
WHERE (((Tbl_HV_Price.Volume)=100000) AND
((Tbl_HV_Price.ArticleNumber)=[Table].[ArticlNumber]));
"Table", c'est la même que dans le module, et en écrivant, je me
rends compte qu'il y a de fortes chances que le problème vienne du
"Articl(e)Number", le champ qui fait le lien entre les deux tables. En
effet, j'ai peur que celui-ci n'évolue pas d'une itération à
l'autre, or [Table].[ArticlNumber] est sensé suivre le même
avancement dans la table que le recordset.
Il faudrait soit envoyer un paramètre à la requête ( c'est possible,
ca ?), soit pouvoir effectuer la même recherche en VBA dans le module,
ce que je ne sais pas faire.
Merci de te pencher sur le problème. Normalement, ma requête ne renvoie qu'un enregistrement en effet, mais elle est sensée être lancée à chaque fois qu'on passe dans la boucle. Ce qui effectivement n'a pas l'air d'être le cas. Voici une partie du code :
Dim Utilisable As Variant Dim rs As DAO.Recordset Set rs = db.OpenRecordset("Table", DB_OPEN_DYNASET)
rs.MoveFirst
Do Until rs.EOF Dim Rec As DAO.Recordset Set Rec = db.OpenRecordset("Requête_Recherche") Utiliseable = Rec![Nom_Champ_Retourné]
SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Table WHERE (((Tbl_HV_Price.Volume)0000) AND ((Tbl_HV_Price.ArticleNumber)=[Table].[ArticlNumber]));
"Table", c'est la même que dans le module, et en écrivant, je me rends compte qu'il y a de fortes chances que le problème vienne du "Articl(e)Number", le champ qui fait le lien entre les deux tables. En effet, j'ai peur que celui-ci n'évolue pas d'une itération à l'autre, or [Table].[ArticlNumber] est sensé suivre le même avancement dans la table que le recordset. Il faudrait soit envoyer un paramètre à la requête ( c'est possible, ca ?), soit pouvoir effectuer la même recherche en VBA dans le module, ce que je ne sais pas faire.
Benoit
Gilbert
Si j'ai bien compris, ta requete de recherche utilise la valeur de l'enregistrement de 'Table'. Dans ce cas utilise :
Set Rec = Db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Table WHERE (((Tbl_HV_Price.Volume)0000) AND ((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));") Je suppose que ArticlNumber est numérique, si c'est une chaine de caractères, il faut rajouter des ' ((Tbl_HV_Price.ArticleNumber)='" & rs![ArticlNumber] & "');")
Gilbert
"oualaléreur" a écrit dans le message de news: Merci de te pencher sur le problème. Normalement, ma requête ne renvoie qu'un enregistrement en effet, mais elle est sensée être lancée à chaque fois qu'on passe dans la boucle. Ce qui effectivement n'a pas l'air d'être le cas. Voici une partie du code :
Dim Utilisable As Variant Dim rs As DAO.Recordset Set rs = db.OpenRecordset("Table", DB_OPEN_DYNASET)
rs.MoveFirst
Do Until rs.EOF Dim Rec As DAO.Recordset Set Rec = db.OpenRecordset("Requête_Recherche") Utiliseable = Rec![Nom_Champ_Retourné]
SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Table WHERE (((Tbl_HV_Price.Volume)0000) AND ((Tbl_HV_Price.ArticleNumber)=[Table].[ArticlNumber]));
"Table", c'est la même que dans le module, et en écrivant, je me rends compte qu'il y a de fortes chances que le problème vienne du "Articl(e)Number", le champ qui fait le lien entre les deux tables. En effet, j'ai peur que celui-ci n'évolue pas d'une itération à l'autre, or [Table].[ArticlNumber] est sensé suivre le même avancement dans la table que le recordset. Il faudrait soit envoyer un paramètre à la requête ( c'est possible, ca ?), soit pouvoir effectuer la même recherche en VBA dans le module, ce que je ne sais pas faire.
Benoit
Si j'ai bien compris, ta requete de recherche utilise la valeur de
l'enregistrement de 'Table'.
Dans ce cas utilise :
Set Rec = Db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM
Tbl_HV_Price, Table WHERE (((Tbl_HV_Price.Volume)0000) AND
((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));")
Je suppose que ArticlNumber est numérique, si c'est une chaine de
caractères, il faut rajouter des '
((Tbl_HV_Price.ArticleNumber)='" & rs![ArticlNumber] & "');")
Gilbert
"oualaléreur" <benoit.vrignon@cpe.fr> a écrit dans le message de
news:1138879738.704599.81060@z14g2000cwz.googlegroups.com...
Merci de te pencher sur le problème. Normalement, ma requête ne
renvoie qu'un enregistrement en effet, mais elle est sensée être
lancée à chaque fois qu'on passe dans la boucle. Ce qui effectivement
n'a pas l'air d'être le cas. Voici une partie du code :
Dim Utilisable As Variant
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("Table", DB_OPEN_DYNASET)
rs.MoveFirst
Do Until rs.EOF
Dim Rec As DAO.Recordset
Set Rec = db.OpenRecordset("Requête_Recherche")
Utiliseable = Rec![Nom_Champ_Retourné]
SELECT Tbl_HV_Price.PricePP
FROM Tbl_HV_Price, Table
WHERE (((Tbl_HV_Price.Volume)0000) AND
((Tbl_HV_Price.ArticleNumber)=[Table].[ArticlNumber]));
"Table", c'est la même que dans le module, et en écrivant, je me
rends compte qu'il y a de fortes chances que le problème vienne du
"Articl(e)Number", le champ qui fait le lien entre les deux tables. En
effet, j'ai peur que celui-ci n'évolue pas d'une itération à
l'autre, or [Table].[ArticlNumber] est sensé suivre le même
avancement dans la table que le recordset.
Il faudrait soit envoyer un paramètre à la requête ( c'est possible,
ca ?), soit pouvoir effectuer la même recherche en VBA dans le module,
ce que je ne sais pas faire.
Si j'ai bien compris, ta requete de recherche utilise la valeur de l'enregistrement de 'Table'. Dans ce cas utilise :
Set Rec = Db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Table WHERE (((Tbl_HV_Price.Volume)0000) AND ((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));") Je suppose que ArticlNumber est numérique, si c'est une chaine de caractères, il faut rajouter des ' ((Tbl_HV_Price.ArticleNumber)='" & rs![ArticlNumber] & "');")
Gilbert
"oualaléreur" a écrit dans le message de news: Merci de te pencher sur le problème. Normalement, ma requête ne renvoie qu'un enregistrement en effet, mais elle est sensée être lancée à chaque fois qu'on passe dans la boucle. Ce qui effectivement n'a pas l'air d'être le cas. Voici une partie du code :
Dim Utilisable As Variant Dim rs As DAO.Recordset Set rs = db.OpenRecordset("Table", DB_OPEN_DYNASET)
rs.MoveFirst
Do Until rs.EOF Dim Rec As DAO.Recordset Set Rec = db.OpenRecordset("Requête_Recherche") Utiliseable = Rec![Nom_Champ_Retourné]
SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Table WHERE (((Tbl_HV_Price.Volume)0000) AND ((Tbl_HV_Price.ArticleNumber)=[Table].[ArticlNumber]));
"Table", c'est la même que dans le module, et en écrivant, je me rends compte qu'il y a de fortes chances que le problème vienne du "Articl(e)Number", le champ qui fait le lien entre les deux tables. En effet, j'ai peur que celui-ci n'évolue pas d'une itération à l'autre, or [Table].[ArticlNumber] est sensé suivre le même avancement dans la table que le recordset. Il faudrait soit envoyer un paramètre à la requête ( c'est possible, ca ?), soit pouvoir effectuer la même recherche en VBA dans le module, ce que je ne sais pas faire.
Benoit
oualaléreur
Bonjour Gilbert, et merci bien,
J'ai encore un problème, quand je veux utiliser le résultat de la requête : soit j'utilise la variable Utilisable, comme ceci : Utiliseable = Rec![PricePP ] et j'obtient un " no current record", soit comme ceci : Utiliseable = Rec et j'obtient "automation error" mais au niveau de la première utilisation de Utilisable dans le calcul cette fois. J'ai essayé Rec.MoveFirst pour palier au "no current record" sans succès, et si j'utilise directement rec dans le calcul, j'obtient "datatype mismatch".
Bref, j'arrive pas à utiliser ce que retourne la requête que tu m'as envoyée.
à +
Benoit
Bonjour Gilbert, et merci bien,
J'ai encore un problème, quand je veux utiliser le résultat de la
requête : soit j'utilise la variable Utilisable, comme ceci :
Utiliseable = Rec![PricePP ] et j'obtient un " no current record",
soit comme ceci : Utiliseable = Rec et j'obtient "automation error"
mais au niveau de la première utilisation de Utilisable dans le calcul
cette fois.
J'ai essayé Rec.MoveFirst pour palier au "no current record" sans
succès, et si j'utilise directement rec dans le calcul, j'obtient
"datatype mismatch".
Bref, j'arrive pas à utiliser ce que retourne la requête que tu m'as
envoyée.
J'ai encore un problème, quand je veux utiliser le résultat de la requête : soit j'utilise la variable Utilisable, comme ceci : Utiliseable = Rec![PricePP ] et j'obtient un " no current record", soit comme ceci : Utiliseable = Rec et j'obtient "automation error" mais au niveau de la première utilisation de Utilisable dans le calcul cette fois. J'ai essayé Rec.MoveFirst pour palier au "no current record" sans succès, et si j'utilise directement rec dans le calcul, j'obtient "datatype mismatch".
Bref, j'arrive pas à utiliser ce que retourne la requête que tu m'as envoyée.
à +
Benoit
Gilbert
Bonsoir,
Ta variable est déclarée comme Dim Utilisable As Variant est ensuite tu as un 'e' en plus Utiliseable = Rec![PricePP ] Est-ce une faute de frappe?
Sinon il est possible que ta requete n'envoie rien dans ton recordset Rec. Tu devrais tester en utilisant le débogueur. Mets des points d'arrêt dans ton code et teste la valeur de Rec.RecordCount et des différents champs. Ca devrait te permettre de trouver la source de ton problème.
Gilbert
"oualaléreur" a écrit dans le message de news: Bonjour Gilbert, et merci bien,
J'ai encore un problème, quand je veux utiliser le résultat de la requête : soit j'utilise la variable Utilisable, comme ceci : Utiliseable = Rec![PricePP ] et j'obtient un " no current record", soit comme ceci : Utiliseable = Rec et j'obtient "automation error" mais au niveau de la première utilisation de Utilisable dans le calcul cette fois. J'ai essayé Rec.MoveFirst pour palier au "no current record" sans succès, et si j'utilise directement rec dans le calcul, j'obtient "datatype mismatch".
Bref, j'arrive pas à utiliser ce que retourne la requête que tu m'as envoyée.
à +
Benoit
Bonsoir,
Ta variable est déclarée comme
Dim Utilisable As Variant
est ensuite tu as un 'e' en plus
Utiliseable = Rec![PricePP ]
Est-ce une faute de frappe?
Sinon il est possible que ta requete n'envoie rien dans ton recordset Rec.
Tu devrais tester en utilisant le débogueur.
Mets des points d'arrêt dans ton code et teste la valeur de Rec.RecordCount
et des différents champs.
Ca devrait te permettre de trouver la source de ton problème.
Gilbert
"oualaléreur" <benoit.vrignon@cpe.fr> a écrit dans le message de
news:1138972401.186477.67040@f14g2000cwb.googlegroups.com...
Bonjour Gilbert, et merci bien,
J'ai encore un problème, quand je veux utiliser le résultat de la
requête : soit j'utilise la variable Utilisable, comme ceci :
Utiliseable = Rec![PricePP ] et j'obtient un " no current record",
soit comme ceci : Utiliseable = Rec et j'obtient "automation error"
mais au niveau de la première utilisation de Utilisable dans le calcul
cette fois.
J'ai essayé Rec.MoveFirst pour palier au "no current record" sans
succès, et si j'utilise directement rec dans le calcul, j'obtient
"datatype mismatch".
Bref, j'arrive pas à utiliser ce que retourne la requête que tu m'as
envoyée.
Ta variable est déclarée comme Dim Utilisable As Variant est ensuite tu as un 'e' en plus Utiliseable = Rec![PricePP ] Est-ce une faute de frappe?
Sinon il est possible que ta requete n'envoie rien dans ton recordset Rec. Tu devrais tester en utilisant le débogueur. Mets des points d'arrêt dans ton code et teste la valeur de Rec.RecordCount et des différents champs. Ca devrait te permettre de trouver la source de ton problème.
Gilbert
"oualaléreur" a écrit dans le message de news: Bonjour Gilbert, et merci bien,
J'ai encore un problème, quand je veux utiliser le résultat de la requête : soit j'utilise la variable Utilisable, comme ceci : Utiliseable = Rec![PricePP ] et j'obtient un " no current record", soit comme ceci : Utiliseable = Rec et j'obtient "automation error" mais au niveau de la première utilisation de Utilisable dans le calcul cette fois. J'ai essayé Rec.MoveFirst pour palier au "no current record" sans succès, et si j'utilise directement rec dans le calcul, j'obtient "datatype mismatch".
Bref, j'arrive pas à utiliser ce que retourne la requête que tu m'as envoyée.
à +
Benoit
oualaléreur
Merci Gilbert, le 'e' n'est qu'une faute de frappe, ma variable a en fait un autre nom trop tordu pour le rendre publique :) Selon les conseils de garfich, j'ai effectivement utilisé Rec.RecordCount, ce qui fonctionne parfaitement. Voici le code à titre indicatif :
Dim Var As Variant Dim rec As DAO.Recordset
Set rec = db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Tbl_AdHock WHERE (((Tbl_HV_Price.Volume)0000) AND ((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));", DB_OPEN_DYNASET)
If (rec.RecordCount <> 0) Then Var = rec![PricePP] End If
Avec ceci, on initialise la variable Var par l'intermédiaire d'un recordset, qui applique un filtre sur une table. dans mon cas, il ne peut y avoir qu'une valeur retournée. Sinon, méfiance...
Merci et à +
Benoit
Merci Gilbert,
le 'e' n'est qu'une faute de frappe, ma variable a en fait un autre nom
trop tordu pour le rendre publique :)
Selon les conseils de garfich, j'ai effectivement utilisé
Rec.RecordCount, ce qui fonctionne parfaitement.
Voici le code à titre indicatif :
Dim Var As Variant
Dim rec As DAO.Recordset
Set rec = db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM
Tbl_HV_Price, Tbl_AdHock WHERE (((Tbl_HV_Price.Volume)=100000) AND
((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));",
DB_OPEN_DYNASET)
If (rec.RecordCount <> 0) Then
Var = rec![PricePP]
End If
Avec ceci, on initialise la variable Var par l'intermédiaire d'un
recordset, qui applique un filtre sur une table. dans mon cas, il ne
peut y avoir qu'une valeur retournée. Sinon, méfiance...
Merci Gilbert, le 'e' n'est qu'une faute de frappe, ma variable a en fait un autre nom trop tordu pour le rendre publique :) Selon les conseils de garfich, j'ai effectivement utilisé Rec.RecordCount, ce qui fonctionne parfaitement. Voici le code à titre indicatif :
Dim Var As Variant Dim rec As DAO.Recordset
Set rec = db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Tbl_AdHock WHERE (((Tbl_HV_Price.Volume)0000) AND ((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));", DB_OPEN_DYNASET)
If (rec.RecordCount <> 0) Then Var = rec![PricePP] End If
Avec ceci, on initialise la variable Var par l'intermédiaire d'un recordset, qui applique un filtre sur une table. dans mon cas, il ne peut y avoir qu'une valeur retournée. Sinon, méfiance...