Código filtro rango de fechas Access

Tengo un formulario Access (un inventario de cajas) basado en una consulta. En el formulario aparecen varios registros, uno para cada caja, con diferentes campos: codigo caja, descripción, año inicial, año final. Me gustaría que el usuario pusiera el año inicial y el año final en dos cuadros de texto y clicase un botón que filtrase todas las cajas comprendidas entre esos dos años, mostrándolas en el formulario.

He probado diferentes códigos VBA que he buscado por Internet pero ninguno me acaba de funcionar.

A ver si alguien me puede echar una mano.

Respuesta
1

Si tienes un formulario que te muestra todos los datos de la tabla, en el encabezado del formulario, o en el pie del formulario, o donde más te guste, añades lo siguiente:

1º/ Un cuadro de texto llamado txtAñoIni (Propiedades->Otras->Nombre)

2º/ Un cuadro de texto llamado txtAñoFin

3º/ Un botón llamado cmdFiltrar

4º/ Opcionalmente, un botón llamado cmdQuitarFiltro.

En el evento "al hacer clic" del botón cmdFiltrar, le pones este código:

If IsNull(Me.txtAñoIni) OR Not IsNumeric(Me.txtAñoIni) Then

Msgbox "Revisa el año inicial, algo no cuadra"

Me.txtAñoIni.SetFocus

Exit Sub

End If

If IsNull(Me.txtAñoFin) OR Not IsNumeric(Me.txtAñoFin) Then

Msgbox "Revisa el año inicial, algo no cuadra"

Me.txtAñoFin.SetFocus

Exit Sub

End If

Me.Filter="[Año Inicial]>=" & Me.txtAñoIni & " AND [Año Final]=" & Me.txtAñoFin

Me.FilterOn=True

Y en el botón para quitar el filtro y volver a mostrar todos los registros, generas, en el evento "al hacer clic" este otro código:

Me.FilterOn=False

Vaya, me acabo de dar cuenta de que no cambié el segundo mensaje de aviso, debería ser:

Msgbox "Revisa el año final, algo no cuadra"

Lógicamente, en el mensaje puedes poner lo que más te guste.

También podrías añadir otras validaciones adicionales, como no permitir números negativos, o limitar el rango de años admitido (seguro que no tienes registros del año 1850 ni del 3026, jejeje)

Vaya, otro lapsus, me "comí" el signo < en la segunda parte del filtro. El correcto sería:

Me.Filter="[Año Inicial]>=" & Me.txtAñoIni & " AND [Año Final]<=" & Me.txtAñoFin

Hola!

En primer lugar gracias por responder tan rápido.

He puesto el código que me has pasado, pero los mensajes tipo "Revisa el año inicial, algo no cuadra" me aparecen aunque rellene los cuadros de texto. ¿Es posible que sea por que tengo el formato de los cuadros de texto como fecha corta en vez de numéricos?

Por otro lado, cuando ejecuto la siguiente línea de código,

Me.Filter="[Año Inicial]>=" & Me.txtAñoIni & " AND [Año Final]=" & Me.txtAñoFin

Me.FilterOn=True

filtra mostrando tan sólo un registro con todos los campos en blanco.

Gracias por la dedicación.

Como a tus campos los llamas "año inicial" y "año final", he supuesto que solo registrabas en ellos el año y no la fecha completa (en cuyo caso yo los hubiera llamado "fecha inicial" y "fecha final"), como parece ser el caso.

Si eso es así, el filtro sería:

Me.Filter="Year([Año Inicial])>=" & Me.txtAñoIni & " AND Year([Año Final])=" & Me.txtAñoFin

En cuanto a lo de los Ifs, si en los cuadros de texto solo vas a poner el año, no tiene sentido que le des formato de fecha corta. De todas formas, esos Ifs no son necesarios para que funcione el filtro y los puedes eliminar. Simplemente te los puse para evitar posibles errores por parte del usuario, como que pongan un texto.

Disculpa, no me expliqué bien. A pesar de que los campos se llamen año inicial y año final, en la empresa escribimos en formato de fecha corta (03/04/2020). Por lo que en los cuadros de texto también tendríamos que escribir en formato de fecha corta.

Otra cosa que quería comentarte es que antes del filtro por fechas, el usuario ha hecho previamente dos filtros de las cajas. Un filtro por la oficina origen de las cajas y otro por tipo de documentación. Buscando en Internet conseguí hacer un código que, clicando un botón, se ejecutaran ambos filtros de golpe.

Por lo tanto el filtro de la fechas debería hacerse sobre los registros (cajas) resultantes de los dos filtros anteriores. Por ejemplo, de la cajas de la oficina origen Madrid y del tipo documentación Albaranes, quiero ver las que van del  año inicio 01/01/2000 al año final 31/06/2001.

La cosa se complica un poco. De nuevo gracias por tu ayuda.

Vale, ahora que tengo toda la información correcta, te puedo dar un código adecuado a tu caso:

If IsNull(Me.txtAñoIni)  Then
    Msgbox "La fecha inicialno puede estar en blanco"
    Me.txtAñoFin.SetFocus
    Exit Sub
End If
If IsNull(Me.txtAñoFin)  Then
    Msgbox "La fecha final no puede estar en blanco"
    Me.txtAñoFin.SetFocus
    Exit Sub
End If
Me.Filter="[Año Inicial]>=#" & Me.txtAñoIni & "# AND [Año Final]<#" & Me.txtAñoFin & "#"
Me.FilterOn=True

Si ves que no te devuelve los registros que debiera, pon así la linea del filtro:

Me.Filter="[Año Inicial]>=#" & Format(Me.txtAñoIni,"mm/dd/yyyy") & "# AND [Año Final]<#" & Format(Me.txtAñoFin,"mm/dd/yyyy") & "#"

Eso para aplicar el filtro solo de fechas.

Si ya tienes otros cuadros de texto en el formulario para filtrar, lo que tienes que hacer es encadenar todos los filtros, por ejemplo:

Me.Filter="[Codigo caja]=" & Me.txtCodigo & " AND TipoCaja='" & Me.txtTipo & "' AND [Año Inicial]>=#" & Format(Me.txtAñoIni,"mm/dd/yyyy") & "# AND [Año Final]<#" & Format(Me.txtAñoFin,"mm/dd/yyyy") & "#"

Fíjate que como ejemplo te he puesto el código como dato numérico (va directo), el tipo como texto (va entre comillas) y las fechas van entre almohadillas.

Puedes ver una forma explicada paso a paso para construir un filtro múltiple aquí: http://neckkito.xyz/nck/index.php/ejemplos/13-formularios/77-crear-un-filtro-multiple

Con ese código puedes escoger uno varios o todos los campos para formar el filtro.

Hola,

El código de filtro para fechas va perfecto. Muchas gracias.

El problema es que no sé cómo hacer para aplicar el filtro de fechas sobre el restultado de un filtro anterior. 

Me explico. Sobre el inventario, el usuario realiza un primer filtro mediante cuadros combinados. Hay dos cuadros combinados (oficina origen y tipo documentación). El usuario, desplegando el primer cuadro combinado, elige la oficina. Después despliega el segundo cuadro combinado y elige el tipo de documentación. Una vez seleccionados ambos, clica un botón que ejecuta un código vba que filtra todas la cajas de la oficina i del tipo de documentación seleccionados en los cuadros combinados.

A continuación el usuario pone las fechas en los cuadros de texto "Año inicial" y "Año final" y clica un botón, ejecutando el código que me has pasado, que filtra las fechas correctamente. El problema es que filtra las fechas sobre la totalidad del inventario, no sobre el resultado de haber filtrado anteriormente por los cuadros combinados.

He mirado la BBDD que me has pasado pero no encuentro una solución.

Gracias por todo el tiempo dedicado. Un saludo.

El enlace que te recomendaba era para que leyeras el ejemplo, que explica paso a paso, cómo construir un filtro múltiple a partir de la selección de uno o más criterios posibles. El ejemplo es 100% aplicable a tu caso, ya que tienes un filtro compuesto por 3 elementos: dos cuadors combinados que filtran dos campos y dos cuadros de texto que filtran un tercer campo.

Además, en mi anterior respuesta te iba explicado cómo hacerlo, y repito:

Si ya tienes otros cuadros de texto en el formulario para filtrar, lo que tienes que hacer es encadenar todos los filtros, por ejemplo:

Me.Filter="[Codigo caja]=" & Me.txtCodigo & " AND TipoCaja='" & Me.txtTipo & "' AND [Año Inicial]>=#" & Format(Me.txtAñoIni,"mm/dd/yyyy") & "# AND [Año Final]<#" & Format(Me.txtAñoFin,"mm/dd/yyyy") & "#"

Fíjate que como ejemplo te he puesto el código como dato numérico (va directo), el tipo como texto (va entre comillas) y las fechas van entre almohadillas.

Tampoco veo qué necesidad tienes de poner un botón apra filtrar por lso dos primeros valores y un segundo botón para añadir el filtro de fechas, pues lo podrías hacer todo usando un único botón siguiendo el ejemplo mencionado.

Pero para responderte con lo que tienes, si al pulsar el segundo botón aún tienes en los combinados los valores seleccionados, el filtro quedaría de esta forma (no sé ni los nombres de los campos ni los de los combinados, y supondré que ambos son textos):

Me.Filter="[Campo1]='" & Me.Combo1 & "' AND Campo2='" & Me.Combo2 & "' AND [Año Inicial]>=#" & Format(Me.txtAñoIni,"mm/dd/yyyy") & "# AND [Año Final]<#" & Format(Me.txtAñoFin,"mm/dd/yyyy") & "#"

Si los combos ya no tienen valor, prueba así:

Me.Filter=Me.Filter & " AND [Año Inicial]>=#" & Format(Me.txtAñoIni,"mm/dd/yyyy") & "# AND [Año Final]<#" & Format(Me.txtAñoFin,"mm/dd/yyyy") & "#"

1 respuesta más de otro experto

Respuesta
1

Tienes otra forma. No necesitarías, en la tabla o consulta, más que un campo, por ejemplo AñoFabricacion, y un botón en el formulario. En el evento Al hacer clic del botón puedes poner

me.recordsource="select * from nombreconsulta where Añofabricación between [Escriba un año inicial] and [Escriba un año final]"

Cuando pulsaras el botón te diría lo de Escriba un año inicial. Lo escribes y Aceptas. Te pedirá el año final, lo escribes y aceptas y el formulario te muestra los registros comprendidos entre esos años. Y te evitas cuadros de texto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas