Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

requete multictritère en VBA : Elément non trouvé dans cette collection. (3265)

2 réponses
Avatar
Eric Brue
Bonjour

Lorsque je fournis mes paramètres en VBA pour une chaine de requetes
multicritères, le code plante lorsque il atteint le 2ème paramètre d'un même
champ de la même requête (OR).
ça affiche: "Elément non trouvé dans cette collection.".
Si quelqu'un a une solution... merci d'avance
Eric

Pour les courageux:
*******une des requêtes en SQL*****
SELECT Patients.[N° patient], MotsClésPatient.[Mot clé]
FROM Patients LEFT JOIN MotsClésPatient ON Patients.[N° patient] =
MotsClésPatient.[N° Patient]
WHERE (((MotsClésPatient.[Mot clé])="MCS1")) OR ((([MCS1]) Is Null)) OR
(((MotsClésPatient.[Mot clé])="MCS2")) OR (((MotsClésPatient.[Mot
clé])="MCS3"));

*******Le code VBA qui lui fournit les paramètres et qui plante************

Sub AjouterSelections()

'Procédure utilisée dans le formulaire "RequêtePatients" et
"RequêteAdresses"
'Procédure qui permet d'attribuer la valeur True à tous les champs
"Selection" de la table "Contacts" dont
'l'enregistrement a été trié par l'enchaînement des requêtes de recherche
multicritères

'l'enchaînement des requêtes (basées sur la même table et contenant des
regroupements) fait que la
'requête finale ("PatientsRequête8") n'est pas modifiable (lecture seule)
donc inutilisable comme source d'un formulaire dont
'les données doivent être modifiables.
' POUR CONTOURNER CE PROBLEME :
'On ouvre un recordset (rs) basé sur la requête "PatientsRequête8" (aprés
avoir fourni les paramètres)
'On fait défiler les enregistrement du recordset ds une boucle
'à chaque enregistrement, on met à jour la table Patients (champ [selection]
= -1 pour le patient = rs![N° Patient]
'On ouvrira le formulaire avec la table comme source et le filtre "Selection
= True"
'tous les champs "selection" de la table seront mis à false sur fermeture du
formulaire ou nouvelle recherche

Dim formRecherche As Form, formAdresse As Form
Dim db As DAO.Database
Dim rs As Recordset 'Recordset basé sur la requête en lecture seule
Dim qdf As QueryDef 'La Requête

Set formRecherche = Forms![RequêtePatients]
Set db = CurrentDb()
Set qdf = db.QueryDefs("PatientsRequête8")


qdf("MCS1") = formRecherche!MCS1
'ça plante là à MCS2 et idem pour toutes les requêtes de ce type
qdf("MCS2") = formRecherche!
qdf("MCS3") = formRecherche!MCS3
qdf("Nbre") = formRecherche!Nbre
qdf("Nsans") = formRecherche!Nsans
qdf("DateDebut") = formRecherche!DateDebut
qdf("DateFin") = formRecherche!DateFin
qdf("Chirurgiens") = formRecherche!Chirurgiens
qdf("CritèreInterventions") = formRecherche!CritèreInterventions
qdf("Hopitaux") = formRecherche!Hopitaux
qdf("Correspondants") = formRecherche!Correspondants

Set rs = qdf.OpenRecordset()
Do While Not rs.EOF
CurrentDb.Execute ("update Patients set Selection=-1 where [N°
patient] = " & rs![N° patient])
rs.MoveNext
Loop

rs.Close
Set rs = Nothing
qdf.Close
Set qdf = Nothing
db.Close
Set db = Nothing
Set formRecherche = Nothing
Set formAdresse = Nothing

End Sub

2 réponses

Avatar
Charles ERNST
MCS1 est un cahmp de votre table ?
Vous êtes sûr que ce ne doit pas être :
WHERE (((MotsClésPatient.[Mot clé])="MCS1")) OR (MotsClésPatient.[Mot clé])
Is Null)) OR
(((MotsClésPatient.[Mot clé])="MCS2")) OR (((MotsClésPatient.[Mot
clé])="MCS3"));



"Eric Brue" a écrit dans le message de news:
O6r1XLe%
Bonjour

Lorsque je fournis mes paramètres en VBA pour une chaine de requetes
multicritères, le code plante lorsque il atteint le 2ème paramètre d'un
même
champ de la même requête (OR).
ça affiche: "Elément non trouvé dans cette collection.".
Si quelqu'un a une solution... merci d'avance
Eric

Pour les courageux:
*******une des requêtes en SQL*****
SELECT Patients.[N° patient], MotsClésPatient.[Mot clé]
FROM Patients LEFT JOIN MotsClésPatient ON Patients.[N° patient] > MotsClésPatient.[N° Patient]
WHERE (((MotsClésPatient.[Mot clé])="MCS1")) OR ((([MCS1]) Is Null)) OR
(((MotsClésPatient.[Mot clé])="MCS2")) OR (((MotsClésPatient.[Mot
clé])="MCS3"));

*******Le code VBA qui lui fournit les paramètres et qui
plante************

Sub AjouterSelections()

'Procédure utilisée dans le formulaire "RequêtePatients" et
"RequêteAdresses"
'Procédure qui permet d'attribuer la valeur True à tous les champs
"Selection" de la table "Contacts" dont
'l'enregistrement a été trié par l'enchaînement des requêtes de recherche
multicritères

'l'enchaînement des requêtes (basées sur la même table et contenant des
regroupements) fait que la
'requête finale ("PatientsRequête8") n'est pas modifiable (lecture seule)
donc inutilisable comme source d'un formulaire dont
'les données doivent être modifiables.
' POUR CONTOURNER CE PROBLEME :
'On ouvre un recordset (rs) basé sur la requête "PatientsRequête8" (aprés
avoir fourni les paramètres)
'On fait défiler les enregistrement du recordset ds une boucle
'à chaque enregistrement, on met à jour la table Patients (champ
[selection]
= -1 pour le patient = rs![N° Patient]
'On ouvrira le formulaire avec la table comme source et le filtre
"Selection
= True"
'tous les champs "selection" de la table seront mis à false sur fermeture
du
formulaire ou nouvelle recherche

Dim formRecherche As Form, formAdresse As Form
Dim db As DAO.Database
Dim rs As Recordset 'Recordset basé sur la requête en lecture seule
Dim qdf As QueryDef 'La Requête

Set formRecherche = Forms![RequêtePatients]
Set db = CurrentDb()
Set qdf = db.QueryDefs("PatientsRequête8")


qdf("MCS1") = formRecherche!MCS1
'ça plante là à MCS2 et idem pour toutes les requêtes de ce type
qdf("MCS2") = formRecherche!
qdf("MCS3") = formRecherche!MCS3
qdf("Nbre") = formRecherche!Nbre
qdf("Nsans") = formRecherche!Nsans
qdf("DateDebut") = formRecherche!DateDebut
qdf("DateFin") = formRecherche!DateFin
qdf("Chirurgiens") = formRecherche!Chirurgiens
qdf("CritèreInterventions") = formRecherche!CritèreInterventions
qdf("Hopitaux") = formRecherche!Hopitaux
qdf("Correspondants") = formRecherche!Correspondants

Set rs = qdf.OpenRecordset()
Do While Not rs.EOF
CurrentDb.Execute ("update Patients set Selection=-1 where [N°
patient] = " & rs![N° patient])
rs.MoveNext
Loop

rs.Close
Set rs = Nothing
qdf.Close
Set qdf = Nothing
db.Close
Set db = Nothing
Set formRecherche = Nothing
Set formAdresse = Nothing

End Sub





Avatar
Eric Brue
MCS1 est un cahmp de votre table ?
Vous êtes sûr que ce ne doit pas être :
WHERE (((MotsClésPatient.[Mot clé])="MCS1")) OR (MotsClésPatient.[Mot
clé])

Is Null)) OR
(((MotsClésPatient.[Mot clé])="MCS2")) OR (((MotsClésPatient.[Mot
clé])="MCS3"));

Non, le problème n'est pas dans l'expression de la requête (je n'ai fait que

copier le code SQL de la requête affiché en mode SQL.

MCS1 ...etc sont des critères. Auparavant pour tester la requête les
critères étaient forms!recherchePatient!MCS1 Maintenat j'ai mis MCS1 pour
simplifier le code VBA.
La requête fonctionne bien. Mon pb c'est d'exprimer les critères en VBA
avant d'ouvrir la requête finale issue d'une suite de requetes diverses. Mon
code vba fonctionne sauf pour les critères de ce type (plusieurs critères
les uns sous les autres dans une même requête).
Merci si vous avez une idée...
Eric