C'est le principe des requêtes imbriqués. Un petit exemple valant mieux qu'un long discourt voilà.
Je commence par faire une requête SQL de sélection puis j'ouvre mon recordset avec la première requête SQL comme composant. Sinon je ne vois que la création d'une querydef, mais je ne trouve pas ça top car en général tu dois la créer puis la supprimer à la fin de ton opération, pour être sûr qu'on ne te la modifie pas. C'est le même principe que la table temporaire.

Dim sql As String, rcd As Recordset, Var As String
Var = "HDS UNIVERSITE"
sql = " SELECT [tblClientèle]![RefClient], [tblClientèle]![Nom], [tblClientèle]![Prénom], [tblServices]![LibelleCour] " & _
" FROM tblServices INNER JOIN tblClientèle ON [tblServices]![RefService] = [tblClientèle]![RefService] " & _
" WHERE ((([tblServices]![LibelleCour])=" & Var & "));"
Set rcd = CurrentDb.OpenRecordset("Select " & sql & ".Nom, " & sql & ".Prénom, " & sql & ".LibelleCour, tblMobilier.CodeBarre " & _
" From " & sql & " INNER JOIN tblMobilier On " & sql & ".RefClient = tblMobilier.RefClient;")
rcd.MoveLast
MsgBox " Il y a " & rcd.RecordCount & " Enregistrements qui satisfont à votre requête!"
rcd.Close