Microsoft Access – Como construir un MultiBuscador

Buscar Registros de Diferentes Tablas de Datos desde una Única Ventana usando VBA

Multibuscador 1

La mayoría de las veces cuando creamos nuestra aplicación ya sea una aplicación pequeña o grande, de interfaz sencilla o al estilo de un CRM (Customer Relationship Management), una de nuestras intenciones, bien por nosotros mismos, por los demás, o porque así nos lo exigen los clientes o usuarios a los que va destinada nuestra aplicación, es poder buscar algún dato  concreto de una serie de registros ubicados en nuestras tablas. Esto que os comento, alguna gente lo soluciona indicando que para buscar un dato en un formulario en concreto pulsemos las teclas CTRL+B, lo cual nos muestra la ventana de “Buscar” que lleva el Office incorporado en sus aplicaciones. Otros utilizan una ventana donde “únicamente” permite buscar por un solo campo:

Microsoft Access - Multibuscador

Pero, si queremos hacer algo más profesional y versátil lo suyo es construir una ventana donde nos permita buscar por más de un dato como Nombre,  Ciudad, Provincia, Fecha, Teléfono Fijo, Móvil, Fax, etc.

Normalmente, y así lo hacía yo hasta hace no mucho, cuando disponemos de una aplicación sobre todo de gestión, lo que se suele hacer es crear un buscador para cada cosa, un buscador para clientes, un buscador para proveedores, un buscador para materiales, un buscador para facturas, etc…, con lo cual podemos llegar a tener una serie de ventanas, que realmente son objetos y que ocupan un espacio en nuestra aplicación, dedicadas para buscar algo concreto.

La idea que hoy traigo es explicaros cómo en una sola ventana poder buscar registros en diferentes tablas, así como indicarle al cuadro de lista qué debe mostrar, Nº de columnas, ancho de las columnas, etc.

Este ejemplo lo vamos a dividir en tres partes: buscar, abrir el registro desde el buscador y abrir el buscador desde el formulario de registros.

1) Buscar.

Para hacer esto, lo primero que debemos hacer es diseñar una ventana parecida a esta:

Microsoft Access - Multibuscador

Como podréis observar en este caso he añadido más opciones que serán visibles únicamente cuando marque en el primer cuadro la opción de “Cliente”.

Para este ejemplo, en el primer cuadro de lista Microsoft Access - Multibuscador  los valores se los indico a mano:

Microsoft Access - Multibuscador

En la pestaña Eventos “Al hacer click”, deberemos poner este código:

Microsoft Access - MultibuscadorMicrosoft Access - Multibuscador

De tal manera que si pulsamos sobre Cliente en el cuadro “Buscar por:” nos quedaría así:

Multibuscador 8

Si os fijáis nos indica (círculo rojo) cuántos registros encuentra.

Para el segundo cuadro de lista Microsoft Access - MultibuscadorMicrosoft Access - Multibuscador

en la pestaña Eventos “Al hacer click”, deberemos poner este código:

Microsoft Access - Multibuscador

Y por último, nos queda indicarle al campo por el que buscamos que nos muestre los resultados según lo indicado en el mismo, para ello,

Microsoft Access - Multibuscador

en la pestaña Eventos “Después de actualizar”, deberemos poner este código. Nota: Como el código de este evento es muy extenso se ha optado por no copiarlo en el artículo por lo que te aconsejo que te descargues el ejemplo y lo veas funcionar.

Lo cual, y siguiendo nuestro ejemplo si yo marco en Cliente y después por Nombre, y ponemos “ca” y pulsamos Intro, éste será el resultado:

Microsoft Access - Multibuscador

¿Y porqué sucede esto?. Porque según el código que le hemos indicado esos son los registros que contienen las letras “ca” dentro del campo Nombre (marcado en amarillo)

Lo que acabo de resaltar en negrita es lo que busca dentro de la tabla Clientes, aquellos que NO son Históricos ((([Clientes].[Historico])=0)) y que dentro del campo Nombre coincida en cualquier parte de la longitud del mismo like ‘*» & Busca.Text & «*’ con lo que se haya puesto en el campo que búsqueda. Lo importante es y como ya se ha explicado en otro post de este blog son los asteriscos (*) delante y detrás del campo que hace de búsqueda. Si os fijáis, la coincidencia puede estar al principio, en medio o al final, pero todas ellas se verán en el buscador.

2) Abrir el registro desde el buscador.

En esta segunda parte y ya sobre los resultados arrojados por el buscador voy a indicar qué hacer para que se abra el formulario en concreto y sobre ese registro en concreto. Para ello en el cuadro de lista que nos muestra los registros encontrados en la pestaña Eventos “Al hacer doble clic”, deberemos poner este código:

Microsoft Access - MultibuscadorMicrosoft Access - Multibuscador

Nos mostrará esta ventana:

Microsoft Access - Multibuscador

Con lo que habréis podido comprobar que me abre la ventana de Clientes justo en el registro que quiero visualizar.

3) Abrir el buscador desde el formulario de registros.

Si observáis el formulario anterior tiene un botón el cual si lo pulsamos nos mostrará nuestro buscador con el cuadro seleccionado, los campos a buscar y los registros que hay. Para ello en el cuadro de propiedades en la pestaña Eventos “Al hacer clic”, deberemos poner este código:

Microsoft Access - Multibuscador

Y tras pulsarlo nos mostrará esto:

Microsoft Access - Multibuscador

Como no quiero hacer esto mucho más extensivo, en el ejemplo hay cuatro casos diferentes (Cliente, Escrito, Gasto, Organo/Tribunal), y así podréis ver cómo funciona ya que tiene cada parte bien diferenciada.

Puedes descargarte el fichero con el multibuscador desde el siguiente enlace.

32 comentarios

  1. Private Sub Lista0_DblClick(Cancel As Integer)
    On Error GoTo Err_Salir_Click
    Dim rst As Recordset

    Select Case Me.Busqueda
    ‘Aquí vemos el valor que le hemos indicado según la opción marcada

    ‘DATOS
    Case Is = «2»
    DoCmd.Close acForm, «Formulario_Datos»
    If Me.Lista0.ListCount = 0 Then
    MsgBox «No hay Datos para mostrar.», vbCritical, «No Datos»
    Exit Sub
    End If

    DoCmd.OpenForm «Formulario_Datos»

    Set rst = Forms!Formulario_Datos.RecordsetClone

    rst.FindFirst «Nº=» & Me.Lista0

    Forms!Formulario_Datos.Bookmark = rst.Bookmark
    DoCmd.Close acForm, «BuscadorGeneral»

    ‘HISTÓRICO
    Case Is = «3»
    DoCmd.Close acForm, «Formulario_Histórico»
    If Me.Lista0.ListCount = 0 Then
    MsgBox «No hay Datos para mostrar.», vbCritical, «No Datos»
    Exit Sub
    End If

    DoCmd.OpenForm «Formulario_Histórico»

    Set rst = Forms!Formulario_Histórico.RecordsetClone

    rst.FindFirst «Nº=» & Me.Lista0

    Forms!Formulario_Histórico.Bookmark = rst.Bookmark
    DoCmd.Close acForm, «BuscadorGeneral»

    End Select

    Set rst = Nothing
    ‘Liberamos el recordset
    Exit_Salir_Click:
    Exit Sub

    Err_Salir_Click:
    MsgBox Err.Description
    Resume Exit_Salir_Click
    End Sub

    Hola amigo, gracias por compartir este multibuscador. Con una base de datos de personal de mi empresa he querido insertar este buscador, he hecho todo pero me ha surgido un problema a la hora del hacer «dobleclick» en el registro que quiero que se abra en formulario. Me da un «error de compilacion: No se encontró el miembro o el dato del miembro» y se me selecciona «Lista0» en la linea: «rst.FindFirst «Nº=» & Me.Lista0″, la verdad es que llevo tiempo intentando averiguar el problema pero no lo encuentro, Nº en el formulario es el mismo que en la tabla y asimismo en Lista0, no se que ocurre. si me puedes ayudar te lo agradeceria mucho. Un Saludo, Jose

    1. Comprueba el orden de tus librerías que pudiera ser una de las causas, debe ser como el que indico:

      – Visual Basic For Applications
      – Microsoft Access XX.0 Object Library (XX.0 corresponde a la versión de Access que tengas tu)
      – Microsoft DAO 3.6 Object Library

      En el ejemplo adjunto de este post también sale activa esta librería

      – Microsoft ActiveX Data Objects 2.5 Library

    2. Solucionado!

      Este el codigo bueno:

      ‘ESCRITOS
      Case Is = «2»
      DoCmd.Close acForm, «Escritos»
      If Me.Lista0.ListCount = 0 Then
      MsgBox «No hay Datos para mostrar.», vbCritical, «No Datos»
      Exit Sub
      End If

      DoCmd.OpenForm «Escritos»

      Set rst = Forms!Escritos.RecordsetClone

      Tu tienes esto
      rst.FindFirst «Nº=» & Me.Lista0

      Y debes poner esto
      rst.FindFirst «IdEscrito=» & Me.Lista0 Me sobraba amp;

      Forms!Escritos.Bookmark = rst.Bookmark
      DoCmd.Close acForm, «BuscadorGeneral»

  2. Hola Angel, en este formulario se podria introducir mas criterios de busquedas, es decir, que ademas de buscar por un campo, me busque por otro, por ejemplo, que busque los clientes que se llamen jose y que tenga la misma fecha de nacimiento. Mi base de datos es de personal militar que tiene categoria, empleo, cuerpo, escala, especialidad, y queria hacer un informe en el que pudiese a priori poder seleccionar que datos filtrar, y este multibuscador me dio la idea. Se podría hacer un informe con los datos filtrados del campo LISTA0 o en su defecto imprimir por completo estos datos? gracias de antemano.

  3. Buenos dias, mire los enlaces al multibuscador se han caido y no me deja descargarlo, me lo podrias mandar al correo.
    Muchas Gracias y este multibuscador me solucionaria todo el problema que estoy teniendo.

  4. Buenos dias Antonio, mira en la parte del multibuscador al hacer doble click y que se me abra otro formulario con los datos que le he pinchado en el multibuscador pues no se a que te refieres con esta parte del codigo porque me da error y siempre se me pone en el primer registro, lo hago asi.

    Private Sub Resultados_DblClick(Cancel As Integer)
    On Error GoTo Err_Salir_Click

    Dim rst As Recordset

    Select Case Me.Busqueda

    ‘Terminos
    Case Is = «1»

    DoCmd.OpenForm «F_Bajas»

    Set rst = Forms!F_Bajas.RecordsetClone
    rst.FindFirst «Indice = » & Me.Resultados
    ‘Busca el primer registro que el termino coincida con la que pone el cuadro de lista
    Forms!F_Bajas.Bookmark = rst.Bookmark
    ‘Establece el registro actual en un objeto Recordset al registro identificado por un marcador válido
    DoCmd.Close acForm, «F_Busqueda»
    ‘Cierra el formulario del buscador

    ‘Siglas
    Case Is = «2»

    DoCmd.OpenForm «F_Bajas»

    Set rst = Forms!F_Bajas.RecordsetClone
    rst.FindFirst Me.Resultados
    ‘Busca el primer registro que el termino coincida con la que pone el cuadro de lista
    Forms!F_Bajas.Bookmark = rst.Bookmark
    ‘Establece el registro actual en un objeto Recordset al registro identificado por un marcador válido
    DoCmd.Close acForm, «F_Busqueda»
    ‘Cierra el formulario del buscador

    End Select

    Set rst = Nothing
    ‘Liberamos el recordset
    Exit_Salir_Click:
    Exit Sub

    Err_Salir_Click:
    MsgBox Err.Description
    Resume Exit_Salir_Click

    End Sub

    Creo que deberia cambiar esta linea, que significa esta linea de codigo porque no le encuentre ninguna explicación a la parte que pone en su codigo: «Nª referencia=», yo lo he cambiado por:
    rst.FindFirst «Indice = » & Me.Resultados
    Si me puede contestar al correo se lo agradeceria.
    Gracias.

  5. Hola, en primer lugar quería felicitarte por compartir este buscador. No soy experto en el tema, pero me ha ido genial para una base de datos particular. Sin embargo tengo un problema. La BD creada tiene tres tablas: Clientes, Vehiculos y Reparaciones, relacionadas entre ellas. Utilicé el buscador para localizar un vehículo y al clicar sobre ese vehículo, se abriese un formulario para introducir lar reparaciones que se han hecho. El problema es que si tengo de alta un vehículo, pero no se ha dado de alta ninguna reparación, cual clikeo dos veces sobre ese vehículo desde el multibuscador, el formulario se abre con el primer registro de la tabla vehículo, y no con el vehículo al que quiero dar de alta una reparación.
    Si ya existen reparaciones, al entrar en la ficha del vehículo (agregar reparación), funciona perfectamente. Es decir, falla cuando el vehículo no tiene todavía ninguna reparación de alta.
    No sé si me he explicado bien, espero que sí. Podrías darme una pista de cual puede ser el fallo?
    Gracias.
    Juan

  6. Hola, disculpa, el enlace para descargar el ejemplo ya no se encuentra disponible y en este momento realmente me sería muy útil, gracias.

  7. Hola, muchas gracias por compartir este multibuscador, me está funcionando muy bien, sólo tenía una duda en la parte de «Me.Lista0.RowSource = «SELECT INGRESO.Fecha_emision, INGRESO.Fecha_recibido, INGRESO.Numero_doc, INGRESO.Depto_envia, INGRESO.Tipo_doc» eso esta ya adaptado a mi código, pero al momento de querer que me aparezcan los registros en la Lista0 no me los muestra, lo que me muestra nada más es » SELECT INGRESO.Fecha_emision, INGRESO.Fecha_recibido, INGRESO.Numero_doc, INGRESO.Depto_envia, INGRESO.Tipo_doc » literal en cada columna, no sé si podrías ayudarme con eso, muchas gracias.

  8. Hola, me ha encantado el multibuscador y ahora te voy a poner un pequeño reto que no consigo resolver.
    He usado el multibuscador en una tabla de alquiler pero necesito contar los equipos que estan en X ubicación. He probado modificando el contador por defecto pero no consigo nada. A ver si eres capaz de resolvermelo.
    Muchas gracias!

  9. Buenas noches estimado,

    Me parece muy didactico tu ejemplo del multibuscador, intente terminar por mi cuenta el codigo pero no me resultó posible.

    Lo que pasa es que los links que dirigen a ciertas partes del codigo del buscador, están rotos.
    Ej1: La imagen del «Cuadro de Lista T» está cortado en la parte de la derecha y no se aprecia el final de la instrucción.
    Me podrias ayudar en darlos de alta o brindarme la nueva ruta?

    Ej2: El link del cuadro de texto «Busca» esta roto y no me redirige a la ubicación del codigo

    Quedo atento
    Saludos Cordiales

  10. He adaptado este multibuscador exitosamente en mi base de datos. Inicialmente tuve algunas dificultades para comprender exactamente los detalles para que funcione la adaptación pero finalmente esta operativo 100%. Ahora bien, deseo hacerlo algo mas funcional. Por ejemplo, quisiera que en la Lista 0 cuando haga click en el título de una columna inmediatamente ordene ascendentemente el resultado en esa columna. De paso, quisiera poner en negrita el título de cada columna y ponerle color.

    Otro comentario que tengo es que en ciertos casos me sale un error que dice «Microsoft Access no encuentra el objeto Contex» que aparentemente es una macro o grupo de macros que no las encuentro.

    Por favor, aclarame y ayudame para perfeccionar tu modelo de multi buscador que esta extraordinario y me ha servido para limpiar muchísimo la pantalla y para hacerle la vida mas sencilla al usuario. Felicitaciones. Puedes escribirme directamente a mi email.

  11. Hola, excelente trabajo, me ha dejado impresionado; no obstante, no me ha funcionado, no es que me salga ningún error, simplemente no ejecuta.
    Yo tengo una DB dedicada a piedras preciosas, y quiero hacer un buscador, ya sea dendro del propio formulario de entrada de datos o mediante formulario independiente, lo que quiero exactamente es que al poner el tipo de gema, me busque solo ese tipo, y que después pueda hacer otra búsqueda en la que me filtre por quilates. Mi DB, contiene las tablas de «productos, compra, venta, proveedores y clientes», todas ellas relacionadas. Te ruego me ayudes en esto; si necesitas algún dado más, estoy encantado de facilitartelo. Mi e-mail es antonio3042arrobahotmail.es

  12. Por favor, podrías ayudarme?
    Como se podría modificar para que el cuadro de lista lista1 quede anulado, es decir, que una vez seleccionado el campo en listaT, la siguiente opción sea escribir directamente en Texto41 el valor a buscar.?
    Y en Lista0 se pueden incluir campos de otras tablas?
    Gracias

  13. hola, muy buen ejemplo se los agradesco, porfa un pequeño ejemplo para imprimir los que se esta viendo o por otra categoria, se los agradeceria mucho.

  14. Hola que tal,

    muchas gracias por tu multibuscador, he querido ver los ejemplos pero el link no funciona. Podrias mandarmelos por separado?

  15. Hola! Muchas gracias por compartir tu trabajo! Estoy aprendendo ahora a utilizar Access porque necesito costruir una base de datos para catalogar fotografias. He hecho mis tablas (son 10) y formularios (4) con sus relaciones y parece funcionar bien. Quiero crear también un buscador general como el tuyo, pero no tengo bastante nivel para desenvolverme con Visual Basic. En síntesis, no sabría adaptar tus códigos a mi base de datos. Por eso quería preguntarte cómo puedo solucionar este problema y cuales son las nociones básicas que debería saber.

    1. A caminar se aprende caminando, Sara. Con Access, como con cualquier otro software, se aprende poco a poco, con paciencia y con muchas ganas de aprender. Con Visual Basic que incluye access puedes aprender leyendo libros pero la mayoría te enseñan a usar el lenguaje en vez de a hacer cosas con el lenguaje. La herramienta básica para aprender son los foros, allí encontrarás innumerables problemas resueltos así como expertos capacitados dispuestos a ayudarte. Busca en Google fotos como los del búho, los de neckitto, o los de la web del programador (LWP).

  16. HOLA FELICIDADES BUEN BUSCADOR..QUISE BAJARLO Y NO FUNCIONA ME LO PODRIAS ENVIAR A MI CORREO…POR TU ATENCION GRACIAS

  17. excelente trabajo solo me genera una duda si al momento de escribir el texto a buscar, quisiera que me realizara la búsqueda en las 4 tablas para no ir de una por una.

    se podra realizar

  18. Buenos días;

    Estoy intentando realizar el multibuscador de manera similar a la que tu realizaste pero la versión que uso es 2013 y me dice que la expresión Me.Busqueda es incorrecto…

    ¿Que puedo hacer?

    Muchas gracias.

  19. Tambien tengo el mismo problema que Sandro, el buscado funciona correctamente pero cuando guardo en access 2013 me da un “error de compilacion: No se encontró el miembro o el dato del miembro” y se me selecciona “Lista0” en la linea: “rst.FindFirst «NºReferencia = » & Me.Lista0″.
    Ya no es capaz de abrir el formulario correcto desde la tabla de busqueda.
    Uso 2013 por que en formularios tengo datos adjuntos ect.
    Le agradeceria si puediera ayudarme.
    Muchas gracias

    1. He podido solucionarlo. Comento lo hice por si sirve para alguien.
      Abres Visual Basic en el formulario de busqueda, y seleccionas Herramientas>Referencias.
      Yo he dejado seleccionadas:
      Visual Basic for Applications
      Microsoft Access 15.0 Object Library
      OLE Automation
      Microsoft DAO 3.6 Object Library
      Microsoft ActiveX Data Objects 2.5 Library

      A mi por lo menos al guardarlo con el formato de 2013 se cambiaban las eferencias. Con estas seleccionadas funciona correctamente.
      Saludos

  20. Buenas Angel. Me ha parecido un trabajo increíble. Yo estoy haciéndome una pequeña BD personal para mi afición (soy filatelico). He intentado implementar tu código en mi BD pero no aunque me descargué tu base de datos para terminar el código no puedo abrirla :(. Hay alguna manera de conseguir esa parte del código???

  21. Buenas noches,

    Tengo un problema con el buscador. Tengo el codigo tal cual el ejemplo descargado. Dejo el mio sobre la opcion doble clik para abrir formulario:

    Private Sub Lista0_DblClick(Cancel As Integer)
    On Error GoTo Err_Salir_Click
    Dim rst As Recordset

    Select Case Me.Busqueda
    ‘Aqui vemos el valor que le hemos indicado segun la opcion marcada

    ‘PRESUPUESTOS
    Case Is = «3» ‘Tenemos marcado PRESUPUESTOS
    If Me.Lista0.ListCount = 0 Then
    MsgBox «No hay datos para mostrar.», vbCritical, «No Datos»
    ‘Indicamelo con un mensaje
    Exit Sub
    End If
    DoCmd.OpenForm «Formulario_Presupuestos_Nuevo»
    ‘Abre el formulario de presupuestos
    Set rst = Forms!Formulario_Presupuestos_Nuevo.RecordsetClone
    rst.FindFirst «PRP=» & Me.Lista0
    ‘Busca el primer registro que la referencia coincida con lo que pone en el cuadro de lista
    Forms!Formulario_Presupuestos_Nuevo.Bookmark = rst.Bookmark
    ‘Establece el registro actual en un objeto Recordset al registro identificado por un marcador valido
    DoCmd.Close acForm, «Busqueda»
    ‘Cierra el formulario del buscador
    ‘EXPEDIENTES
    Case Is = «2»
    If Me.Lista0.ListCount = 0 Then
    MsgBox «No hay datos que mostrar.», vbCritical, «No Datos»
    Exit Sub
    End If
    DoCmd.OpenForm «Formulario_Expedientes»
    Set rst = Forms!Formulario_Expedientes.RecordsetClone
    rst.FindFirst «Numero_EXP= ‘» & Me.Lista0 & «‘»
    Forms!Formulario_Expedientes.Bookmark = rst.Bookmark
    DoCmd.Close acForm, «Busqueda»
    End Select

    Set rst = Nothing
    ‘Liberamos el recordset
    Exit_Salir_Click:
    Exit Sub
    Err_Salir_Click:
    MsgBox Err.Description
    Resume Exit_Salir_Click
    End Sub

    Pues, bien, con el CASO Presupuestos, el formulario se abre donde toca, pero con la opcion expedientes, siempre abre el mismo registro.

    Decir que el campo Numero_EXP en del tipo Texto corto

    Gracias por vuestra ayuda.

    Saludos

  22. Buenos dias, ¿Como estan?

    Intentando adaptar el codigo a una BD propia y respetando toda la sintaxis y orden no he podido lograrlo.

    Al seleccionar la primera entidad, la «Lista0» no me trae ningun dato.

Responder a Josseline Cancelar respuesta

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