Access – Hacer que un buscador encuentre registros en formato texto bien vayan acentuados o no usando VBA

A veces al crear un buscador para nuestra aplicación no hemos tenido en cuenta pequeños detalles, los cuales después nos harán darnos alguna carrera para solucionarlo. Uno de estos detalles, es que a la hora de introducir datos en un formulario, sobre todo en campos de tipo texto, hay gente que tiene el buen hacer de acentuar las palabras según corresponda, aunque no siempre se cumple esa regla ya que puede haber uno o varios registros donde haya puesto “García” y en otros “Garcia”. Lógicamente, esto si no lo hemos tenido en cuenta a la hora de programar con código VBA, en los resultados de una búsqueda nos encontraremos que no nos mostrará todos los datos que realmente hay en la tabla ya que para Access “García” y “Garcia” son dos cosas diferentes.

Por ello, la intención de este ejemplo es dar a conocer los pasos para poder tener en cuenta tal caso y no quedarnos con cara de sorprendido, ¿no crees?

Para ello, lo primero es copiar el siguiente código en un Módulo:

Una vez tengamos esto, debemos construir nuestro buscador, el cual ya di unas nociones en otro post. Lo importante es el campo que hace la búsqueda, que es el que va a buscar todos los registros coincidentes vayan acentuados o no. Este es el campo al que me refiero:

Acces Filtrar por VBA con acentos

 

Nos vamos a las Propiedades de este campo y en el evento “Después de actualizar”,

Access Filtrando con tildes por vba

 

Ponemos el siguiente código:

 

Como podréis observar aquellas opciones que se que sólo llevan texto y en las que puede haber texto acentuado son en donde llamo al módulo SinTildes.Buscaacent(Busca.Text), de tal forma que si hay resultados coincidentes me va a indicar todos los que haya estén o no acentuados.

De tal forma, que siguiendo este ejemplo si yo quiero buscar los registros que se apelliden “García” o “Garcia”, el buscador me arrojará los siguientes resultados, y como podréis comprobar no es necesario en el campo de búsqueda indicarle el apellido completo:

BuscarConTildes04

Como podréis observar el buscador ha encontrado todas aquellas coincidencias según lo indicado y ha mostrado todos los resultados estén o no acentuados.

¿Quieres probarlo por ti mismo?. Descárgate los ejemplos y pruébalos.

1- Ejemplo completo del que se ha extraído y resumido para este artículo, donde encontrarás muchos mas filtros que en el ejemplo.

2- Ejemplo resumido. Para hacer mas sencillo el artículo se ha simplificado el archivo original del autor.

Estudió formación profesional en la rama de electrónica hasta que descubrió el apasionante mundo de los ordenadores personales. Desde entonces, la administración de bases de datos, hojas de cálculo y programación en Microsoft Visual Basic para aplicaciones le han acompañado hasta el día de hoy. En estos momentos, su principal interés está enfocado a portabilizar las bases de datos a dispositivos móviles Windows e IOS, en entornos cliente servidor, enfocado en desarrollos con Microsoft Access, FileMaker y Servidores en la nube como Microsoft SQL Azure.

15 Comments

  1. Responder Joan

    hola,
    estoy probando este multibuscador y lo estoy sacando bien, tengo un problema, como no!, es que cuando hago el doble click en la ventana lista0, si no hay ningun campo seleccionado me da error, por donde podría encararlo para solucionar el dobleclick sin darle a un registro.

    gracias

    • Responder @docebit

      Por ejemplo podrías controlar si es nulo el Id, mas o menos así:

      If isnull(TuCampoId) then Exist sub

    • Responder Antonio Martínez

      Si te fijas Joan en el post hay dos ejemplos, un resumido y un completo, en el ejemplo completo cuando tu haces doble clic en el campo Lista0

      If Me.Lista0.ListCount = 0 Then ‘Si no hay registros
      MsgBox “No hay Datos para mostrar.”, vbCritical, “No Datos”
      Exit Sub
      End If

      Por lo tanto, el ejemplo completo lleva todo lo necesario para que veas el funcionamiento del buscador en su totalidad.

      • Responder Joan

        si, pero si la lista0 es diferente de zero y haces click fuera de los resultados da error,
        probaré lo del null.
        gracias

    • Responder Antonio Martínez

      Lo que no entiendo es pq quieres hacer doble clic fuera de donde está la lista de datos, lo normal es que sobre los resultados dados hagas doble clic y te llevará a su ficha, esa es la función de este ejemplo, pero para subsanar el error, con este código (al hacer doble clic) lo debes solucionar:

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

      If Me.Lista0.ListCount = 0 Then ‘Si no hay registros
      ‘Indícamelo con un mensaje
      MsgBox “No hay Datos para mostrar.”, vbCritical, “No Datos”
      Exit Sub
      End If

      DoCmd.OpenForm “Clientes”
      ‘Abre el formulario Clientes

      Set rst = Forms!Clientes.RecordsetClone
      rst.FindFirst “NºReferencia = ” & Me.Lista0
      ‘Busca el primer registro que la referencia coincida con la que pone el cuadro de lista
      Forms!Clientes.Bookmark = rst.Bookmark
      ‘Establece el registro actual en un objeto Recordset al registro identificado por un marcador válido
      DoCmd.Close acForm, “Buscar”
      ‘Cierra el formulario del buscador

      Exit_Lista0_DblClick:
      Exit Sub

      Err_Lista0_DblClick:
      ‘MsgBox Err.Description
      Resume Exit_Lista0_DblClick
      End Sub

  2. Responder Dan

    Hola como sería el código si quisiera que automáticamente luego de que pulse o teclee una letra el cuadro de lista se refresque o actualice sin necesidad de darle “Enter”. ¿Me podría proporcionar por favor un ejemplo sencillo con esta característica? siempre tal y como lo tiene en el ejemplo sencillo, el cuadro de lista a dos columnas pero la búsqueda solo con texto. Mil Gracias de antemano. Saludos!!!

    • Responder Antonio Martínez

      Muy buenas Dan. Para lo que me propones es tan fácil como el código que hay puesto en el ejemplo del campo “Buscar”, el que hace la búsqueda y arroja los resultados sobre la lista, en la acción “Después de Actualizar” (AfterUpdate) lo cortas y lo pegas en la acción “Al cambiar” (Change). Cuando comiences a escribir en el campo “indique la búsqueda” verás como el cuadro de lista mostrará las coincidencias conforme vayas escribiendo.

      He de decirte que esto tiene un “pero”, si trabajas en local y con pocos datos este no te supondrá ningún problema ahora, si trabajas en red ten en cuenta que por cada letra que escribes el programa envía una orden a la tabla y te devuelve los resultados coincidentes, por lo que si hay una gran cantidad de datos puede haber pequeños retrasos a la hora de mostrar los resultados, sólo para que lo tengas en cuenta.

  3. Responder lucho

    Estoy trabajando sobre una tabla(1) y necesito que el dato que digite lo busque en otra tabla(2) la cual contiene el mismo campo con las mismas caracteristicas de la anterior tabla(1). Lo he probado con tablas relacionales pero no he podido conseguir que me de un mensaje que el dicho dato digitado ya esta en la segunda tabla(2). Le agradeceria infinitamente a quien me pueda ayudar.

    • Responder Antonio Martínez

      Muy buenas lucho. Hace algún tiempo tenía que averiguar cuando introducía el campo DNI/NIF saber si ya estaba dado de alta en una tabla, por lo tanto creo que se adapta a lo que tu preguntas. Para aclararte un poco más lo que yo hacía es, una vez en el campo DNI/NIF lo introducía donde pulsaba INTRO lo cual me llevaba al siguiente campo que se llamaba “Direccion” donde si encontraba el mismo registro que el introducido me lo decía y encima bloqueaba el resto de los campos del formulario, para que no pudieras seguir introduciendo datos y ponía el campo DNI/NIF en rojo. Usaba este código:

      Private Sub Direccion_GotFocus()
      Dim Busca As Variant
      Dim miBD As Database, miTabla As Recordset
      Set miBD = DBEngine.Workspaces(0).Databases(0)
      Set miTabla = Me.RecordsetClone
      Busca = Me.NIF

      If IsNull(Busca) Then
      Exit Sub
      End If

      Set miTabla = miBD.OpenRecordset(“tabla2”, dbOpenDynaset) ‘ Abro la tabla 2.

      With miTabla
      ‘ Busca el registro cuyo numero sea el actual.
      .FindFirst “NIF =” + “‘” + Busca + “‘” ‘Campo tipo texto
      If Not .NoMatch Then ‘ Si se encuentra registro.
      MsgBox “Ya existe un registro con este NIF.”, vbExclamation, “NIF encontrado”
      Me.NIF.ForeColor = 255
      Me.Nombre.SetFocus
      Me.Direccion.Enabled = False
      Me.EMail.Enabled = False
      Me.CP.Enabled = False
      Me.Localidad.Enabled = False
      Me.Provincia.Enabled = False
      .Close
      ‘End If
      Else
      If .NoMatch Then ‘ Si no se encuentra registro.
      Me.NIF.ForeColor = 3355443
      Me.Direccion.Enabled = True
      Me.EMail.Enabled = True
      Me.CP.Enabled = True
      Me.Localidad.Enabled = True
      Me.Provincia.Enabled = True
      .Close
      End If
      End If
      End With

      End Sub

  4. Responder Sergio

    Buenos Dias
    al dar el codigo
    Private Sub lstSeleccionaCampo_Click()
    Me.((Busca)).Visible = True (a mi no me aparece la función que esta entre paréntesis )
    ‘Muestra el campo por el que hago la búsqueda
    Que puedo hacer ????

Deja un comentario

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR