Si el filtro se aplica en un subformulario, solo se necesita ajustar la ruta.
Los filtros del formulario funcionan con dos parámetros, uno es la condición (la igualdad a cumplir) y el otro es si se activa o no se activa (que es mas sencillo que borrar y escribir la condición).
'Me' hace referencia al formulario en que corre el código y permite que las rutas sean relativas en lugar de absolutas.
Para referirse a un formulario (en funciones de subformulario) solo hay que indicárselo a Access añadiéndole la palabra reservada 'Form':
El filtro aplicado al formulario principal:
Me.Filter = "Año = " & Me.[nombre del combo]
El mismo filtro aplicado a un subformulario que se llamase 'Reservas':
Me.Reservas.FORM.Filter = "Año = " & Me.[nombre del combo]
(Me ==> los objetos son locales)
(Reservas ==> el nombre del objeto subformulario)
(FORM ==> el indicador de que no es un cuadro de texto o combo: es un formulario)
(Filter ==> la propiedad del formulario que contiene la condición)
Se puede referenciar a cualquier propiedad, por ejemplo el indicador de que el filtro esta activo o inactivo (FilterOn):
Me.Reservas.FORM.FilterOn = True (-1) // False (0)
Access interpreta al cero como FALSE, a cualquier otro valor diferente de cero como TRUE
En el evento en el que se evalúe el dato del combo y se genere la condición en base al año se pueden dar dos opciones o es un año (numero) o el texto 'Todos'.
Si comparamos el valor que devuelve el combo (un numero de año o el texto 'Todos') con 'TODOS' se obtiene una de dos respuestas:
.- Se cumple (True)
.- No se cumple (False)
La respuesta es perfectamente valida para activar el filtro y el código quedará así:
Me.Reservas.FORM.Filter = "Año = " & Me.[nombre del combo]
Me.Reservas.FORM.FilterOn = Me.[nombre del combo] <> "Todos"
La primera línea genera el filtro a aplicar, la segunda lo aplica.
(Si el combo devuelve 'Todos' la condición no se cumple, el resultado será FALSE: el filtro no se aplica y mostrara todos los años)