Filtros en formularios dependiendo de cuadros de texto

Como puedo aplicar varios filtros en un formulario dependiendo de lo que digite en varios cuadros de texto, he encontrado el siguiente código pero solamente me filtra lo que digite en el cuadro y no me deja filtrado los otros cuadros si tienen algún filtro

Private Sub FiltroParte_AfterUpdate()
Filter = "[Parte] like '*" & Me.FiltroParte & "*'"
Me.Filter = Filter
Me.FilterOn = True
End Sub

1 respuesta

Respuesta
3

La solución a tu pregunta depende un poco de cómo quieras que funcione el filtro, es decir, ¿quieres qué filtre cuando rellenas el primer cuadro de texto, luego que filtre estos resultados ya filtrados al rellenar el segundo cuadro, y así sucesivamente... o por el contrario quieres rellenar uno o más cuadros y que te filtre todo de golpe, al darle a un botón?

Incluso también habría que saber si lo cuadros de texto van a filtrar el mismo campo o campos distintos, es decir, si quieres filtrar por año, por ejemplo, y pones en un cuadro 2011 y en otro 2012, que te muestre los registros del año 2011 y l 2012, o los de 2011, o 2012 o los dos...

Si tu caso es el primero, tendrías que copiar ese código, adaptado a los campos que quieres filtrar, y poniendo como Filtro:
Filter = Filter & "AND " & "estructura del filtro nuevo"

Si lo quieres hacer por medio de un botón, en el evento al hacer click del mismo, le pones (voy a suponer que los cuadros en los que metes los datos del filtro se llaman FiltroParte1, FiltroParte2...):

Filter="[Campo1] like '*" & Me.FiltroParte1 & "*'"
If not isnull(Me.FiltroParte2) Then
Filter=Filter & " AND [Campo2] like '*" & Me.FiltroParte2 & "*'"
End If
If not isnull(Me.FiltroParte3) Then
Filter=Filter & " AND [Campo3] like '*" & Me.FiltroParte3 & "*'"
End If
y así sucesivamente...
y acabas el código con:
Me.Filter = Filter
Me.FilterOn = True
End Sub

Y para acabar, si es el caso como el que te comento de los años, tienes que unir los filtros con OR en vez de AND.

Fíjate en los espacios entre las "" y los AND, para que te funcione correctamente el filtro.

Cordial saludo, no había contemplado todas estas posibilidades, pero me resultaría mejor la primera opción que dices, es decir ir filtrando a medida que se rellenen los cuadros, como sera el código como por ejemplo para encadenar 3 cuadros (a,b y c) a 3 campos del formulario (aa,bb y cc)?, al borrar el cuadro "a" se mantienen los filtros de los cuadros "b y c"?

Pues sería una cosa así:

Private Sub a_AfterUpdate()
Dim miFiltro As String
If Not IsNull(Me.a) Then
miFiltro = "[aa] Like '*" & Me.a & "*'"
End If
If Not IsNull(Me.b) Then
If miFiltro = "" Then
miFiltro = "[bb] Like '*" & Me.b & "*'"
Else
miFiltro = miFiltro & " AND [bb] Like '*" & Me.b & "*'"
End If
End If
If Not IsNull(Me.c) Then
If miFiltro = "" Then
miFiltro = "[cc] Like '*" & Me.c & "*'"
Else
miFiltro = miFiltro & " AND [cc] Like '*" & Me.c & "*'"
End If
End If
If miFiltro = "" Then
Me.FilterOn = False
Exit Sub
End If
Me.Filter = miFiltro
Me.FilterOn = True
End Sub
Private Sub b_AfterUpdate()
Call a_AfterUpdate
End Sub
Private Sub c_AfterUpdate()
Call a_AfterUpdate
End Sub

Puntualizaciones:

Si los campos aa, bb o cc son numéricos, tienes que quitarle las comillas simples al filtro (por ejemplo, si aa es el numérico: miFiltro = "[aa] Like " & Me.a )

Si lo que quieres es que te filtre por valores iguales a los introducidos en a, b y c, tienes que cambiar Like por =

Buenos días, estuve efectuando las pruebas y me arroja el siguiente error " Se esperaba expresión" la expresión no das como resultado el nombre de una macro, de una función definida por el usuario p procedimiento de evento", los campos aa y cc son numéricos y les he quitado las comillas simples

Se me pasó que LIKE sólo lo puedes usar con cadenas de texto, no números. Si le vuelves a poner las comillas simples, debería funcionar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas