Filtrar fila solo con un botón de opción activado
Construir un filtro de forma dinámica es sencillo, solo exige 'tener las ideas muy claras'.
En VBA tenemos a disposición la opción de activar/desactivar los filtros aplicados en los formularios y es independiente de como se genere o aplique el filtro (se aplica o no se aplica).
Para construir el filtro, lo mas habitual consiste en evaluar todas las condiciones de forma independiente y de cumplirse aunarlas para crear el filtro.
Hay que partir de un concepto que tiene que quedar diáfano:
La opción 'todos' (en una condición) no tiene sentido, simplemente se excluye la condición
Aclarando: si tenemos un conjunto de datos (alumnos por ejemplo) y han de cumplir dos condiciones (tener una edad concreta y ser varones):
Select * From alumnos where Edad = 18 And Sexo = 'Varon'
en el supuesto de que una de ellas la desestimemos (no diferenciaremos por sexo) el generador de consultas lo generaría asi:
Select * From alumnos where Edad = 18 And Sexo = '*'
Pero es 'mas limpia' y rápida si la generamos asi:
Select * From alumnos where Edad = 18
Para esto ultimo lo haríamos asi (hay mas métodos, pero cada uno utiliza el que mas le gusta)
' Dimensionmos una variable de texto:
Dim MiFiltro As String
'Evaluamos si se aplica la condición edad, si se cumple .....
If Nz(Me.Edad, 0) <> 0 Then MiFiltro = "Edad =" & Me.Edad
'Si no se cumple, en MiFiltro hay una cadena vacia
'Evaluamos si se aplica la condición Sexo:
If Nz(Me.Sexo, "") <> "" Then
'Ahora evalumos si en la variable 'MiFiltro' hay contenido, si lo hay añadimos un AND)
IF MiFiltro <> "" Then MiFiltro = MiFiltro & " AND "
'Como hay condición que cumplir, la concatenamos
MiFiltro = MiFiltro & "Sexo = '" & Me.Sexo & "'"
End IF
... se repite este paso para cada condición ....
Al final (y con los datos actuales) en MIFiltro puede haber lo siguiente:
a.- Edad = 18 And Sexo ='Varon'
b.- Edad = 18
c.- Sexo = 'Varon'
d.- "" <== nada
Asignamos el filtro al formulario:
Me.Filter = MiFiltro
' verificamos si el filtro tiene sentido aplicarlo, esto es: que MiFiltro sea diferente de 'nada' para aplicarlo o no
Me.FilterOn = MiFiltro <> ""
Aqui es donde se puede depender de una casilla de verificación (por ejemplo)
Me.FilterOn = Me.CasillaDeVerificacion
O combinando:
Me.FilterOn = MiFiltro <> "" And Me.CasillaDeVerificacion
Nota: Un campo (edad) es numérico y al otro (sexo) se le trata como texto, aplica en tu filtro el adecuado al dato (guíate por el ejemplo tras razonarlo, es elemental y sencillo)