Access, Excel, VBA y más

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

Access Buscar texto acentuado

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:

 

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

 

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:

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.

Salir de la versión móvil