Microsoft Access – Filtrar formulario usando VBA – Uniéndolo todo

Si seguiste el tutorial anterior “Filtrar formulario usando VBA” donde te mostraba como filtrar un subformulario a través de un campo tipo fecha ahora es el momento de terminar nuestro tutorial combinando todo lo amprendido en los tres anteriores y haciendo, de nuestro formulario de búsqueda, una herramienta muy potente.

Seguiré utilizando la base de datos del ejemplo anterior. Es una base de datos de películas con sus calificaciones, según el ministerio de educación y cultura de España que es de donde he descargado la base de datos con cerca de 77.000 registros lo que además nos viene bien para comprobar el poder de Microsoft Access trabajando con bases de datos extensas.

La idea es sencilla, tenemos un formulario principal que no está vinculado a ninguna tabla y sobre este, un subformulario vinculado a la tabla “Películas”, que muestra todos los registros. A través del formulario principal escribiremos los distintos filtros, pudiendo combinarlos, y pulsando el botón “Buscar” nos localizará la película que estemos buscando de entre todas las disponibles en la base de datos.

Filtrando Fechas

En este último tutorial vamos a combinar los filtros por texto, numéricos y de fechas, aplicando entre ellos, solo en caso de tener datos para filtrar, el operador “AND”. La idea es leer, uno por uno, los cuadros de texto e ir componiendo un solo filtro, combinación de todos.

Hay que prestar especial atención al filtro por fecha en el que hemos ampliado su funcionalidad. Tal y como lo diseñamos en el tutorial anterior tenía el inconveniente de que, para usarlo, había que itroducir obligatoriamente la fecha de inicio y la fecha fin, en caso de faltar uno de los dos datos era imposible filtrar entre fechas. Para solventar ese inconveniente nos hemos apoyado de la función “NZ” que nos permite utilizar un valor alternativo en caso de que el que necesitamos sea nulo. Su uso es muy sencillo:

Nz(“Usa este dato”, “Pero si es nulo usa este otro”)

No tiene más, así que aprovechándonos de su peculiaridad le hemos dicho a Access algo como:

NZ(“FechaInicio”,”Si  no hay, pones el 01/01/1900”)

Evaluamos la fecha inicio y si el usuario no la ha puesto directament usamos la fecha mas baja que nos deja utilizar Access, que por defecto en el 01/01/1900

Con la fecha fin hacemos lo mismo:

NZ(“FechaFin”,”Si  no hay, pones el 31/12/9999”)

En este caso, si no se ha especificado la fecha fin le decimos que utilice la fecha mas alta que admite Access, por tanto  en el peor de los casos, si no se introduce ninguna de las dos fechas, nuestro código filtrará desde el 01/01/1900 hasta el 31/12/9999 o sea, que nos mostrará todos los registros.

Si se especifica solo la fecha fin y se deja en blanco la fecha inicio, filtraríamos desde el 01/01/1900 hasta la fecha fin especificada. Nos estamos asegurando que siempre filtre. ¿Sencilla la solución, verdad?

Para no transcribir el código entero te recomiendo que te descargues el ejemplo ya que he comentado línea por línea todo el código para que puedas entender su funcionamiento.

Como aplicar el filtro al formulario

Los formularios en Access tienen dos propiedades que son las que vamos a modificar mediante código VBA y son:

  • Filter
  • FilterOn

Con la propiedad Filter especificamos el filtro concreto que queremos utilizar, por ejemplo “Que el título contenga el texto Batman y que la fecha de calificación esté comprendida entre el 01/01/2000 y 31/12/2005”, como ves, ahora podemos combinar mas de un filtro.

Y con la propiedad FilterOn le diremos que aplique ese filtro.

Esas dos propiedades las vamos a configurar en el evento “Click” del botón “Buscar” situado en el formulario principal.

Hasta aquí el tutorial de cuatro capítulos sobre los filtros en formularios. A través de ellos hemos aprendido a filtrar texto, números y fechas.

He de recordar que cualquiera de estos filtros se pueden aplicar pulsando con el botón derecho del ratón sobre cualquiera de las columnas del subformulario pero nuestra finalidad es diseñar una aplicación con una estética cuidada y la sencillez absoluta para un usuario que, en la mayoría de los casos, no será un experto en Access.

Referencias

Descarga el archivo de ejemplo

Listado de películas del ministerio de Educación y Cultura

Si quieres saber más

Curso de iniciación a Microsoft Access

Curso Avanzado de Microsoft Access con VBA

 

17 comentarios

  1. Ángel, excelente tu aporte… me ha ayudado muchisimo. Estare pendiente de lo que sigue… felicitaciones.

  2. buen dia;
    es posible hacer este tipo de filtros en tiempo real, osea que cuando escriba dentro del textbox, automáticamente filtre.
    en lo posible puedes adjuntar un ejemplo.

    1. Hola, es tan sencillo como usar el código, en vez de en el botón, en el evento «al cambiar» de cualquier cuadro de texto.
      Puedes copiar el código en un procedimiento independiente de cualquier evento, por ejemplo:

      Prívate Sub MiCodigoQueFiltra()
      Código
      End Sub

      Y luego en cualquier evento «al cambiar» de tus cuadros de texto, llamarlo:

      Call MiCodigoQueFiltra

  3. oie no puedo descargar el archivo

    quisiera saber si me podrian ayudar a aplicar dos filtros en el mismo formulario, uno por fecha y uno por nombre!.
    ya revise su tutorial sobre periodos de fechas, y lo hace bien, pero al intentar uqe despues filtre por nombre me deja este ultimo filtro solamente!…

    GRacias =)

    1. Hola, por supuesto que no hay problema, se pueden combinar perfectamente. Respecto al fichero de este artículo donde se explica precisamente eso, voy a revisar a ver porque no has podido descargarlo.

      1. Ya lo logreE!!… muchas gracias!! =)

        al parecer el problema de la descarga era con la compu con la que estaba trabajando!!

        GraciasS!

  4. Hola, he seguido tu ejemplo y me parece fantástico, yo siempre filtraba las fechas en la consulta, pero esto me parece mas practico. El Problema lo tengo cuando intento imprimir un informe vasado en los datos filtrados, ya que me imprime todos los registros de la tabla. Podrías darme alguna idea para solucionarlo?. Gracias Un Saludo.

    1. Hombre, con tan poquita información que me das sobre como lo estás haciendo se me hace difícil orientarte. Si me aportas algún dato más podría hacerme una idea de donde estás fallando.

  5. Claro, perdona.
    Veras el filtro lo hago como en el ejemplo, solo que los datos lo cojo de una consulta y no de la tabla y los presento en un subformulario vinculado a dicha consulta. El filtro de fechas lo hace perfecto y me los muestra en el subForm, el problema lo tengo cuando pretendo sacar en un informe dichos datos filtrados, ya que en dicho informe me aparecen todos los registros, es como si el filtro dejase de actuar.
    No se si me he explicado. Gracias.

  6. Buenos días
    En primer lugar mi agradecimiento por su aporte, es de gran ayuda.
    En segundo lugar, he conseguido que todos y cada uno de los filtros me funcionen correctamente de forma independiente, no obstante tengo problemas para poder ver el archivo de ejemplo (creo que es problema del pc del trabajo) y no consigo anidar los filtros sin el ejemplo, podría facilitarme el archivo de ejemplo de otro modo? o explicar en contestacion a este comentario cómo anidalos?
    Muchas gracias

  7. tengo esta consukta a un informe:
    DoCmd.OpenReport «InfPagoDoctor1», acViewPreview, entreFechas, «((fechaPago >= #» & Format(txtFechaDesde, «mm-dd-yyyy») & «#) and (fechaPago <= #" & Format(txtFechaHasta, "mm-dd-yyyy") & "#)) and ( Doctor = " & cmbDoctor & ")", acDialog
    Perome arroja el siguiente error
    "Error de sintaxis (falta operador"…….
    lo que quiero es que me filtre por un rango en tre fechas y luego solo algun doctor

  8. Hola,
    Hace unos meses me fue de gran ayuda tu tutorial para aplicar filtros. Esta vez me he animado a unirlos, y de nuevo tu tutorial y el ejemplo han sido imprescindibles para conseguirlo.

    ¡¡¡ Muchas gracias !!!

  9. Hola, buenos días.
    He aprendido mucho con este blog, pero tengo un problemilla que me supera.
    He estado siguiendo el tutorial de los filtros. Me ha parecido muy interesante y lo voy entendiendo bastante bien. Quisiera hacer algo parecido en una base de datos que he creado, (Deseo filtrar por tres campos distintos, dos de ellos texto y un tercero intervalo de fechas) pero en vez de tener el subformulario ya abierto dentro del formulario, que muestre la información deseada al pulsar el botón «BUSCAR», lo que pretendo es que ese botón «buscar» abra un informe aparte con la información filtrada. Y ahí es donde estoy atascada… entiendo cómo asignar todos estos filtros a una variable . Lo que me falla es pasar la información de esta variable al informe, cuando éste se abre….
    He intentado, después de asignar el filtro a la variable, abrir el informe con DoCmd.OpenReport y luego usar el comando FILTER y el FILTER ON, pero no me reconoce el nombre del informe. Luego intenté poner todas las condiciones de filtrado en los parámetros del DoCmd.OpenReport, pero entre las comillas, los asteriscos, y los tipos de campos también me da fallos. No me reconoce el campo fecha….
    El informe está basado en una consulta cuyo origen son varias tablas distintas….
    Por favor, por favor, ¿podrían indicarme cómo conseguir abrir ese informe?
    Muchas gracias.

  10. Hola Buenas tardes,

    He tenido problemas al unir varios criterios de consulta para unificar el filtro, puntualmente con la funcion «AND», siempre me sale el error 13 «No coinciden los tipos»; ¿alguien me puede guiar al respecto?

  11. En primer lugar darte las gracias por poner tu sabiduría al servicio de los demás.
    He seguido los anteriores tutoriales sobre filtros en formulario con VBA y me ha ido genial, pero este no logro entenderlo. Para mí ignorancia en este tema, sería más fácil ver el código del ejemplo. ¿Podrías publicar el código uniendo los filtros?

    Muchas gracias

Responder a Ruth Cancelar respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.