Microsoft Access – Filtrar formulario usando VBA – Filtrando Texto

Filtrar un formulario en Access usando código VBA es más sencillo de lo que imaginamos. Las versiones actuales de Microsoft Access incluyen muchos filtros en sus formularios para que los usuarios que dominen la aplicación puedan utilizarlos sin tener que programar nada pero en muchos casos nos encontramos con la necesidad de diseñar una base de datos para usuarios menos expertos y debemos proporcionarle una herramienta que les simplifique lo máximo posible su uso.

Para ello hemos diseñado el siguiente ejemplo. 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” y 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.

 Access Filtro Formulario

En este primer tutorial nos vamos a centrar solamente en el filtro por el título de la película, el cual en un campo tipo “Texto”. Como puedes comprobar en el ejemplo, el resto de filtros están desactivados y los iremos activando en los próximos tutoriales donde ampliaremos los filtros usados.

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 campo Título contenga la palabra Batman”

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.

Recordemos antes de nada como debemos filtrar un campo tipo texto que de las dos siguientes opciones usaremos la segunda:

    1. TituloComercial = “Batman”, en este caso solo buscaría el título que contuviera esa palabra exacta, por ejemplo “Batman Return” no sería capaz de encontrarla.
    2. TituloComercial LIKE  “*Batman*”, el modificador “LIKE” es más versátil que el “=” y nos permite usar comodines en la búsqueda como el “*”. En este caso buscaría cualquier película cuyo título contuviera la palabra “Batman”

Sigamos desgranando el ejemplo, lo primero que haremos será crear una variable para guardar en ella el filtro.

Dim sFiltro as String

Y ahora guardamos en ella el filtro

sFiltro = "TituloComercial LIKE ' * " & Me.txtTitulo & " * ' "

Esta es la parte más delicada de los filtros de texto, si logras comprender como lo he construido todo será mucho más sencillo. Vamos a explicarlo.

Para asignar a la variable sFiltro todo el filtro, hay que dárselo encerrado entre comillas dobles. Dentro del filtro tenemos una complejidad añadida y es que queremos que lea, como término a buscar, el texto que tenemos en un cuadro de texto del formulario al que hemos llamado txtTitulo y además vamos a incorporar directamente el caracter comodín asterisco (*) a ambos lados del texto a buscar para que busque cualquier texto que contenga la palabra buscada. Si quieres saber más sobre el uso de los caracteres comodín puedes visitar el siguiente enlace de Microsoft donde explican su funcionamiento. Simplificando mucho y en español esto es lo que deberíamos de decirle al filtro.

Mi variable sFiltro  es =  «Campo TituloComercial LIKE  “ * El Título que estoy buscando * ”   »

Como puedes ver para asignar el filtro a la variable, este al completo, debe ir encerrado entre comillas dobles pero es que además dentro del propio filtro, el texto a buscar, TAMBIÉN hay que encerrarlo entre comillas dobles ya que es una cadena de caracteres y en VBA toda cadena de caracteres SIEMPRE va encerrada entre comillas dobles.

Pero en este caso tan concreto, ya verás que no pasa con otros filtros numéricos o de fechas, mezclarle tantas comillas dobles hace que Access se lie a la hora de asignar el filtro por ello a la cadena de caracteres que identifica el texto a buscar le vamos a sustituir las comillas dobles (“) por comillas simples (‘) de esta manera:

Mi variable sFiltro  es =  «Campo TituloComercial LIKE  ‘ * El Título que estoy buscando * ’  »

Resuelta la primera complejidad, vamos a resolver la segunda, El Título que estoy buscando es un cuadro de texto de nuestro formulario y, para que nuestro filtro se capaz de leerlo debemos de CORTAR la cadena de texto del filtro a la altura donde tenemos que especificar el cuadro de texto y, una vez especificado el mismo, volver a UNIR el filtro. Para conseguirlo nos ayudaremos del símbolo (&) que en VBA se utiliza para UNIR cadenas de caracteres. En español otra vez, deberíamos de decirle algo así:

Mi variable sFiltro  es =  «Campo TituloComercial LIKE  ‘ * ” & Me.txtFiltro & » * ’  »

Como puedes observar, he CORTADO el filtro cerrando comillas dobles, después del (&) he especificado mi cuadro de texto del formulario y a continuación, tras el siguiente (&), he vuelto a abrir comillas para terminar de completar el filtro. A groso modo, he dividido el filtro en tres partes que se han unido mediante el símbolo (&):

    1. 1- «Campo TituloComercial LIKE  ‘ * ”
    2. 2- & Me.txtFiltro &
    3. 3- » * ’  «

Te recomiendo encarecidamente que repases estos pasos antes de seguir, mucha gente se lía con ellos, sin embargo, una vez que tienes claro el concepto que es muy, pero que muy sencillo, serás capaz de escribir filtros en VBA con los ojos cerrados.

Pues ya tenemos el filtro asignado a nuestra variable sFiltro, ahora solo nos queda especificar a Access que le asigne esa variable al subformulario y a continuación que lo filtre activándole el filtro. El código completo del botón buscar será este:

Private Sub cmdFiltrar_Click()
 
' Creamos la variable que contendrá el filtro
 
Dim sFiltro As String
 
' Asignamos el filtro a la variable
 
sFiltro = "TituloComercial LIKE'*" & Me.txtTitulo & "*'"
 
' Asignamos la varaible a la propiedad Filter del subformulario
 
Me.BusquedaSubFormulario.Form.Filter = sFiltro
 
' Le decimos al subformulario que active el filtro
 
' que previamente hemos asignado.
 
Me.BusquedaSubFormulario.Form.FilterOn = True
 
End Sub

Como puedes ver, mucho rollo de explicación para que al final, con cuatro líneas tengamos un filtro que hace maravillas.

Como toque final debemos desactivar el filtro con el botón “Mostrar Todos” y nada más simple como poner el filtro del subformulario en blanco, luego desactivar el filtro y si somos muy perfeccionistas, limpiar el cuadro de texto para que el usuario pueda realizar una nueva búsqueda.

Private Sub cmdQuitarFiltro_Click()
 
'Para eliminar el filtro lo dejamos en blanco con ""
 
Me.BusquedaSubFormulario.Form.Filter = ""
 
'A continuación desactivamos el filtro
 
Me.BusquedaSubFormulario.Form.FilterOn = False
 
'Y para rematar, el cuadro de texto del formulario
 
'lo ponemos en blanco para que podamos filtrar por
 
'otro término, esto ya es opcional.
 
Me.txtTitulo = Null
 
End Sub

Referencias

Descárgate el 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

 

10 comentarios

  1. Amigo exelente tu blog me ha servido muchísimo muchas gracias, pero tengo una duda que significa la palabra TituloComercial en la parte donde le asignas el filtro a la variable? Mi duda es saber que significa esa palabra si es el nombre de un campo de tabla, si es el nombre del cuadro de texto del subformulario. Saludos y gracias por compartir sus conocimientos

  2. Esta interesante, yo estoy iniciando en este mundo de la programación en Acces, mi pregunta es como hago para que al ingresar un texto en el cuadro de texto me vaya filtrando automáticamente conforme a los caracteres que voy digitando, es decir sin necesidad de hacer click en boton buscar.

  3. Excelente explicación. Yo quiero aplicar varios filtros al mismo formulario como lo hago. tomando el ejemplo suyo que me traiga lo que tenga en distribuidora y genero….gracias.

  4. Hola,
    Llevaba dos horas peleándome con filtros en subformularios, añadiendo y quitando comillas, y tu explicación me lo ha resuelto en cinco minutos.
    ¡Muchísimas gracias!

  5. Hola. Muchas gracias por compartir tu saber. Me está sirviendo de mucho. He seguido toda la serie: cómo filtrar texto, filtrar números, filtrar fecha…. el siguiente artículo, el que combina todos estos filtros, no lo he encontrado. Seguro que es porque no he buscado bien; ¿podrías por favor indicar cómo combinar todos estos filtros? Gracias de nuevo por tu ayuda.

  6. He aplicado el filtro de la siguiente forma
    MITABLABindingSource.Filter = «CODIGOLIBRE Like ‘*» & TipoSoporteNuevoN & «*'»
    En el DATAGRIDVIEW que tiene como origen de datos este Binding solo me muestra 10 resultados cuando
    debería contener mas de 4.000.
    Necesito el primero que cumpla la condición.
    Para otros valores de búsqueda me funciona perfectamente aunque tienen menos filas (Desde 0 hasta algo menos de 2.000)
    Que error estoy cometiendo.
    Agradecería una solución
    Paco Barreiro

  7. Hola.
    Magnifica explicación. Muchas gracias por compartir tus conocimiento. Pero tengo un problema, yo necesitaría que al pinchar en un botón se abriera otro formulario filtrado con datos del primer formulario y lo siento, no sé cómo aplicar tu explicación a mi caso.

Deja un comentario

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