Direi che hai letto male... o non hai una visione chiara della cosa.
Le Query di tipo PassTrought, vengono passate al Server ma sono in ReadOnly, ma se tu passi al Server quella che hai scritto ti fa le pernacchie...!
L'errore che hai commesso è inserire nel predicato SQL un riferimento ad un'ogegtto del Client che per consentire al motore di risolvere la query deve risolverne il Valore...!
SELECT Articoli.codice as master, Inner.Codice as codice
FROM Articoli INNER JOIN [Inner] ON Articoli.ID = Inner.Unione
WHERE inner.codice=[Forms]![Articoli]![cercacodice]
UNION select articoli.codice as master, articoli.codice as codice
from articoli
where codice=[Forms]![Articoli]![cercacodice];
Come vedi hai nel predicato ben 2 Riferimenti a 2 Oggetti del Client di Access che non hanno nulla in comune con quanto il motore del DB riesce a capire...!
Serve in questi casi sfruttare il DRIVER e passare al Server il predicato SQL già risolto.
Hai 2 Opzioni:
Query Parametrica, quindi passi il parametro come Valore e non come Oggetto
PARAMETERS pCodice Long;
SELECT Articoli.codice as master, Inner.Codice as codice
FROM Articoli INNER JOIN [Inner] ON Articoli.ID = Inner.Unione
WHERE inner.codice=[pCodice]
UNION select articoli.codice as master, articoli.codice as codice
from articoli
where codice=[pCodice];
Quindi apri la Query come Recordset valorizzando il parametro la puoi poi assegnare alla Form o LisBox.
Set Me.Recordset=TuoRecordset
Oppure la costruisci
Dim qdf As DAO.Recordset
Dim sSQL As String
sSQL="SELECT * FROM T1 WHERE Codice=" & [Forms]![Articoli]![cercacodice]
CurrentDb.QueryDefs("Q1").SQL=sSQL
In questo modo il predicato SQL non contiene l'oggetto ma il suo valore che viene risolto dal VBA ricavando il valore dall'oggetto Client e concatenando la Stringa del predicato SQL.
Buona lettura.