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:

Function Buscaacent(X)
On Error GoTo Err_Busca
Dim I As Variant, A As Integer, L As Integer, busc As Variant
Dim Letra As Variant, vocal As Variant, nuevaletra As Variant
Static letras(5) As Variant

L = Len(X)
busc = X
A = 1
letras(1) = "AÁÀÂÄ"
letras(2) = "EÉÈÊË"
letras(3) = "IÍÌÎÏ"
letras(4) = "OÓÒÔÖ0"
letras(5) = "UÚÙÛÜ"

While> A <= L
Letra = Mid(busc, A, 1)
For Each I In letras
vocal = InStr(1, I, Letra, 1)
If vocal > 0 Then
nuevaletra = "[" & I & "]"
busc = Left(busc, A - 1) & nuevaletra & Right(busc, L - A)
A = A + 1 + Len(I)
L = L + 1 + Len(I)
Exit For
End If
Next
A = A + 1
Wend
If busc = "" Then
Buscaacent = X
Else
Buscaacent = busc
End If
' Autor: J.Bengoechea
Exit_Busca:
Exit Function
Err_Busca:
MsgBox "No hay un dato por el que buscar", vbInformation, "AVISO"
Resume Exit_Busca:
End Function

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:

 

Private Sub Busca_AfterUpdate()
Select Case Me.lstSeleccionaCampo
Case Is = "Nº Referencia"
Me.Lista0.RowSource = "SELECT Clientes.NºReferencia, " _
& "Clientes.NºRef," _
& "Clientes.Nombre " _
& "FROM Clientes " _
& "WHERE [Clientes].[NºRef] LIKE '*" & Busca.Text & "*'" _
& "ORDER BY [NºRef]ASC"
Case Is = "Nombre"
Me.Lista0.RowSource = "SELECT Clientes.NºReferencia, " _
& "Clientes.NºRef, " _
& "Clientes.Nombre " _
& "FROM Clientes " _
& "WHERE [Clientes].[Nombre] like '*" _
& SinTildes.Buscaacent(Busca.Text) _
& "*' ORDER BY [Nombre]ASC"
End Select

'Indica el Nº de registros
If Me.Lista0.ListCount = 0 Then
Me.txtRegistrosMostrados = "0"
Else
Me.txtRegistrosMostrados = Me.Lista0.ListCount - 1
 End If
End Sub

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.

16 comentarios

  1. 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

    1. 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.

    2. 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. 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!!!

    1. 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. 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.

    1. 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. 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 ????

    1. Muy buenas.

      Sin una explicación de lo que intentas hacer y algo más de código, no me es posible ayudarte, pero creo que has confundido los términos. «Busca» es un control, un campo dentro de un formulario y que tras actualizarse «AfterUpdate» consigue unos resultados que se muestran en el cuadro de lista.

      1. Buenos Días
        Lo que pasa es que no me deja insertar el control (Busca) me da son otras opciones
        Discúlpeme si no soy muy claro al explicarme, Me gustaría comunicarme con usted por un inbox
        Gracias

  5. Buenos dias,
    He usado el ejemplo para crear una busqueda de mi base de datos. sin embargo al hacer doble click o click y enter, abre el otro formulario con todos los datos del proveedor, pero siempre abre en el primer registro de la base de datos, no en el registro que yo busco.

    este es el codigo adaptado a mi BBDD

    Private Sub Lista0_DblClick(Cancel As Integer)
    Dim Rs As Recordset

    If Me.Lista0.ListCount = 0 Then ‘Si no hay registros
    MsgBox «No hay datos para mostrar.», vbCritical, «No Datos»
    ‘Indicamelo con un mensaje
    Exit Sub
    End If

    DoCmd.OpenForm «Clientes»
    ‘Abre el formulario Clientes

    Set Rst = Forms!Clientes.RecordsetClone
    Rst.FindFirst «ID = » & 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, «Busqueda»
    ‘Cierra el formulario del buscador

    End Sub

    Saludos cordiales

Responder a lucho Cancelar respuesta

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