MS Access VBA: muestra los resultados de SQL generados dinámicamente en un subformulario de hoja de datos

Tengo varios años de experiencia con VBA en aplicaciones de MS Office (para procesos de automatización y ETL) pero no he tenido la necesidad de meterme con Forms en MS Access hasta hace poco. Estoy diseñando para algunos formularios de extracción de datos simples para una base de datos que he diseñado y estoy colgado de lo que parece ser una tarea simple.

Objetivo: Necesito un subformulario de hoja de datos para mostrar los registros devueltos desde una declaración SQL generada dinámicamente desde los controles en el formulario principal.

En mi formulario principal, tengo un botón que cuando un usuario hace clic en él, el botón compilará la información especificada por el usuario en otros controles de formulario de usuario en una consulta SQL y luego ejecutará esa consulta para que un subformulario muestre los registros resultantes.

No importa lo que haga, no puedo hacer que esto funcione. Sigo recibiendo (la mayoría de las veces, de todos modos) el error de tiempo de ejecución básico de Microsoft "" 2467 ": la expresión que ingresó se refiere a un objeto que está cerrado o no existe". Ese es el error que recibo con el código que se muestra a continuación. No puedo averiguar si de alguna manera necesito iniciar el subformulario tan pronto como se ejecute cualquier código o qué. He intentado algunas otras variaciones de código que tampoco han funcionado en otros foros de código, pero parece que he encontrado varios hilos en el foro, incluidos algunos en Desbordamiento de pila que sugieren que el código que tengo a continuación debería funcionar.

La imagen adjunta muestra cómo se ve la forma principal básica. He etiquetado el botón en el que el usuario haría clic (btnDisplaySWData) para compilar el SQL que se crea desde los controles que aún no se han incluido, pero ese no es el problema. Solo estoy codificando una declaración SQL como se muestra en el fragmento de código al tratar de resolver este problema. Como se mencionó, quiero que los registros se muestren en el subformulario denominado dataDisplaySubform. "JUNK" es una tabla en la base de datos de Access que puedo consultar legítimamente con el código SQL que se encuentra a continuación y que estoy utilizando para realizar pruebas hasta que descubra esto. Todo el código en el formulario de datos que se muestra (denominado frmDataExtract) consiste en lo que se encuentra en la ventana de código a continuación.

Option Compare Database
Option Explicit
Public Sub btnDisplaySWData_Click()
    Dim pSQL As String
    pSQL = "SELECT JUNK.agency_ID, JUNK.agency_desc FROM JUNK"
    Me.dataDisplaySubform.Form.RecordSource = pSQL
End Sub

El formulario se denomina dataDisplaySubform, como se muestra en la siguiente captura de pantalla de las propiedades con el subformulario seleccionado.

Así es como se ve el diseño general de la forma

He rastreado varios sitios de foros y también he intentado cada variación de términos con la búsqueda de Desbordamiento de pila para encontrar posibles soluciones para mi problema, pero ninguno ha funcionado incluso cuando el hilo original fue resuelto por la persona que lo publicó. He pasado demasiado tiempo, alrededor de 2 días laborables, tratando de averiguar qué estoy haciendo mal y aún no he podido.

Aprecio a cualquiera que pueda ayudarme a guiarme en la dirección correcta, esto me está volviendo loco.

gracias, --TB

SOLUCIÓN EDITADA POR TURKISHGOLD

Bueno, creo que lo resolví por mi cuenta, aunque HansUp me guió por el camino con la mención de que el subgrupo Source Object no tenía nada asignado. En mi caso, asignar el objeto de origen a un formulario no fue la solución correcta, que es lo que sugirió HansUp. En cambio, una consulta guardada parece hacer que haga lo que quiero.

No estoy seguro de si hay una mejor manera de hacer esto, pero parece que necesita configurar una consulta ficticia, casi de marcador de posición, por lo que puede configurar el objeto de origen del subformulario en VBA. Una consulta de marcador de posición como esta:

SELECT * FROM JUNK WHERE JUNK.agency_ID ="_";

La consulta de acceso anterior se guarda como el nombre "PRUEBA DE PRUEBA". No muestra nada, pero satisface la necesidad de tener un Objeto de Origen asignado a algo, esencialmente creando una instancia del subformulario cuando se mira el formulario principal en la vista de formulario. Por lo tanto, con la consulta guardada de marcador de posición, puede reasignar el RecordSource a cualquier cadena de SQL que se reúna mediante los controles de la interfaz de usuario en el formulario principal, como este

Public Sub btnDisplaySWData_Click()
    Dim pSQL As String
    pSQL = "SELECT JUNK.agency_ID, JUNK.agency_desc FROM JUNK"
    Me.dataDisplaySubform.SourceObject = "Query.TESTQUERY"
    Me.dataDisplaySubform.Form.RecordSource = pSQL
    Me.dataDisplaySubform.Requery
End Sub

que cuando el Formulario está en producción, la declaración de SQL codificada de manera firme almacenada en la variable de cadena pSQL se integrará a través de la entrada del usuario en los controles del formulario principal.

Así que ahora, cuando se hace clic en btnDisplaySWData, hace lo que estaba tratando de hacer y muestra los registros.

Respuestas a la pregunta(4)

Su respuesta a la pregunta