El siguiente ejemplo. En el se comprueba una fecha de un campo de un formulario, si existe se usa esa fecha y si no existe se usa usa fecha 'prehistórica' para que se seleccionen todos los registros existentes posteriores a esa fecha, es decir, todos los registros (que además cumplan el resto de condiciones que tengas en tu consulta).. En tu caso imagino que buscas registros entre dos fechas, por lo que usarías el ENTRE y con cada una de las fechas el mismo sistema con una fecha pasada o futura.
SELECT CITAS.Fecha_Cita, CITAS.Hora_Inicio, CITAS.Hora_Final, CITAS.Cliente
FROM CITAS
WHERE (((CITAS.Fecha_Cita)>IIf(IsNull([Formularios]![CITAS]![Fecha_Cita]),#1/1/1000#,[Formularios]![CITAS]![Fecha_Cita])));
Con respecto a tu segunda pregunta basta con que en la consulta uses en cada campo el filtro adecuado. Me explico. Tu ingresas en cada columna de la consulta que quieras usar como posible filtro un criterio de filtrado que use algo similar a lo anterior. Por ejemplo, si usas entre otros un filtro sobre un campo que contiene valores de texto, debes de definir el criterio de filtro para que lo use si hay algún valor y no lo use si no has escrito nada en ese filtro. Digo que no lo usa cuando realmente lo está usando, pero al cumplir todos los registros con esa condición el resultado es el mismo a no usar en ese momento ese filtro.
Volviendo al ejemplo anterior, te lo modifico de modo que además del filtrado por el campo CITAS_Fecha tenga en cuenta también si existe algún valor en el filtro aplicado al campo Cliente.
SELECT CITAS.Fecha_Cita, CITAS.Hora_Inicio, CITAS.Hora_Final, CITAS.Cliente
FROM CITAS
WHERE (((CITAS.Fecha_Cita)>IIf(IsNull([Formularios]![CITAS]![Fecha_Cita]),#1/1/1000#,[Formularios]![CITAS]![Fecha_Cita])) AND ((CITAS.Cliente) Like IIf(IsNull([Formularios]![CITAS]![Cliente]),"*",[Formularios]![CITAS]![Cliente])));
Como verás basta con usar la condición que comprueba si hay algo en el campo de filtrado ‘Cliente’, Si hay algo lo usa para el filtrado y si no usa el * para no restringir registros por este criterio,
En resumen, ambos campos se tienen en cuenta para el filtrado comprobando si no hay valores para aplicar lo que corresponda.
Una última consideración. SI no necesitas visualizar la consulta, ósea, si simplemente es el origen de datos de un informe o similar, es más versátil construirla y usarla en código, aunque el resultado final de registros obtenidos sea en ambos casos el mismo.
Cordiales saludos.