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.