Agreed: it's not particluarly obvious.
When you use an expression such as:
[Forms].[Form1].[Text99]
in a query, the query calls a thing called the Expression Service (ES) which
tries to make sense of it. If the ES finds Form1 open, and find a text box
named Text99 on it, the ES passes back the value to the query. If the query
doesn't get a value returned, it pops up a parameter box for you to enter a
value.
The ES is not available when you OpenRecordset() in code, e.g. it cannot
make sense of this:
Dim rs As DAO.Recordset
Dim strSql As String
strSql "SELECT * FROM Table1 WHERE ID = [Forms].[Form1].[Text99]"
Set rs = dbEngine(0)(0).OpenRecordset(strSql) 'Error!!!
What happens is that it complains about the "parameter."
However, you can build the string so the number goes into the string:
strSql "SELECT * FROM Table1 WHERE ID = " & [Forms].[Form1].[Text99]
This creates a string that looks like this if the text box contains 88:
SELECT * FROM Table1 WHERE ID = 88
and the OpenRecordset can make sense of that.
In your particular case, you tried to use a string containing:
"... where [QRID] = Me.Parent.txtQRID.Value"
so it works when you use:
"... where [QRID] = " & Me.Parent.txtQRID.Value
When you put a literal value into the query string, you do need to use
delimiters around it: quotes around text, or # around date values. So
there's a bit more to learn about how to put quotes inside quotes:
http://allenbrowne.com/casu-17.html
Hope that helps.

Signature
Allen Browne - Microsoft MVP. Perth, Western Australia
Tips for Access users - http://allenbrowne.com/tips.html
Reply to group, rather than allenbrowne at mvps dot org.
> Thanks Allen! You're a gem! Blowed if I understand the syntax of
> concatenation requirements in code.
[quoted text clipped - 52 lines]
>> > Wend
>> > End Function