<<"too few parameters. expected 2">>
it's not a limitation. When you open a query in code, Access leaves everything up to you. That includes resolving any references. Fortunately, there is an easy way around that:
Dim db As Database
Dim qdef As QueryDef
Dim rs As Recordset
Set db = CurrentDb()
Set qdef = db.QueryDefs(source)
qdef.Parameters(0) = Eval(qdef.Parameters(0).Name)
Set rs = qdef.OpenRecordset()
Since the parameter name is a reference to the form and control, using Eval() gets the value for you. If you had multiple parameters, then you would just loop on the parameters collection doing a Eval() for each.
JimD.