Transformar letras con acento en letras sin ellos en VBA Excel 2010

De Excel estoy haciendo una base de datos y un formulario de búsqueda y tengo un problemita con el tema de los acentos.

La situación esta así, tengo mi hoja de datos, en la Columna A, están mis datos, en especifico son nombres propios, y tengo un formulario el cual busca con un bucle For.. Next coincidencias ingresadas en un TextBox y los muestra en un ListBox, todo bien hasta ahí, el detalle empieza cuando el usuario busca ya sea palabras con acento o sin estos y se encuentran registrados de otra manera, para solucionar esto se me ocurrió copiar todo lo que hay en la columna A a la columna B y después reemplazar todas la letras con acento a letras sin acento para después hacer la búsqueda en la columna B, todo bien hasta ahí, pero ahora necesito que cuando el usuario ingrese una letra con acento, esta se "convierta" a una sin acento, por ejemplo sin ingreso el apellido RAMÍREZ QUEDE COMO RAMIREZ.

Para esto se me ocurrió el siguiente código

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'>> CONVERTIR "Á" A "A"
If KeyAscii = 181 Then
KeyAscii = 0
Me.TextBox1 = Me.TextBox1 & KeyAscii = 65
End If
End Sub

Pero no funciona. 

2 respuestas

Respuesta
2

Una opción es que lo hagas en el evento exit del textbox, por ejemplo:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Por.Dante Amor
    sina = Replace(TextBox1, "Á", "A")
    sina = Replace(sina, "É", "E")
    sina = Replace(sina, "Í", "I")
    sina = Replace(sina, "Ó", "O")
    sina = Replace(sina, "Ú", "U")
    sina = Replace(sina, "á", "a")
    sina = Replace(sina, "é", "e")
    sina = Replace(sina, "í", "i")
    sina = Replace(sina, "ó", "o")
    TextBox1 = Replace(sina, "ú", "u")
End Sub

Otra opción, es que dejes el textbox1 tal y como fue capturado, y antes de empezar tu ciclo de búsqueda pongas el resultado en una variable, por ejemplo:

Private Sub CommandButton1_Click()
'Por.Dante Amor
    sina = Replace(TextBox1, "Á", "A")
    sina = Replace(sina, "É", "E")
    sina = Replace(sina, "Í", "I")
    sina = Replace(sina, "Ó", "O")
    sina = Replace(sina, "Ú", "U")
    sina = Replace(sina, "á", "a")
    sina = Replace(sina, "é", "e")
    sina = Replace(sina, "í", "i")
    sina = Replace(sina, "ó", "o")
    sina = Replace(sina, "ú", "u")
    '
    For i = 1 To Range("B" & Rows.Count).End(xlUp).Row
        If Cells(i, "B") = sina Then
            ListBox1.AddItem Cells(i, "B")
        End If
    Next
End Sub

Nota: El ciclo que puse es un ejemplo, deberás utilizar la variable "sina" en tu ciclo.


Una tercera opción, para que no crees la columna "B".

Con lo siguiente realizas tu búsqueda en la misma columna "A". Te puse la Function SinAcento, con esto convierte la palabra a mayúsculas y quita los acentos. Lo que hace es comparar el dato de la columna A (convertido a mayúsculas y sin acentos), y lo compara con lo que tiene el textbox1 (convertido a mayúsculas y sin acentos). La conversión a mayúsculas y sin acentos se hace en memoria, no afecta ni tus datos de la columna "A", ni tu dato capturado en el textbox1.

Deberás ajustar tu ciclo para enviarle a la función SinAcento el nombre de cada celda.

Private Sub CommandButton1_Click()
'Por.Dante Amor
    For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
        If SinAcento(Cells(i, "A")) = SinAcento(TextBox1) Then
            ListBox1.AddItem Cells(i, "A")
        End If
    Next
End Sub
Function SinAcento(pal)
'Por.Dante Amor
    sina = UCase(pal)
    sina = Replace(sina, "Á", "A")
    sina = Replace(sina, "É", "E")
    sina = Replace(sina, "Í", "I")
    sina = Replace(sina, "Ó", "O")
    SinAcento = Replace(sina, "Ú", "U")
End Function

Avísame si tienes dudas de cómo adaptar cualquier solución a tu formulario.


Muchas gracias. Excelente respuesta. Funciona a la perfección.

Buen día Dante, estoy checando tu respuesta y la última opción me interesa mucho, pero no comprendo de la función. No logro adaptarlo. Me podrías explicar un poco más por favor? de antemano muchas gracias.

En la columna A tienes los nombres.

Bueno, lo que entiendo es que tienes un textbox, en el textbox capturas por ejemplo "María", y quieres que en el listbox te aparezcan las coincidencias: María o Maria, ¿correcto?

Primero, tienes que poner el código en un commandbutton.

Después, capturas "María" en el textbox y presionas el commmandbutton.

Lo que hace mi función es lo siguiente:

- Hay un ciclo desde la fila 1 y hasta la última fila con datos de la columna "B", ¿correcto?

- Después tengo esto:

If SinAcento(Cells(i, "A")) = SinAcento(TextBox1) Then

Lo que hace lo anterior ejecutar 2 veces la función SinAcento, para la primera vez ejecuta SinAcento con el nombre que está en la celda y la segunda vez la ejecuta con el nombre que está en textbox, digamos que ya con los 2 resultados, los compara, si son iguales los carga en el listbox, si no, pasa a la siguiente celda.

Ahora, lo que hace la función "SinAcento", toma el nombre que recibe como parámetro, le quita los acentos y regresa el nombre pero sin acentos.

Espero que con la explicación puedas adaptarlo, de lo contrario envíame tu archivo con el formulario y con la macro y le hago los cambios. Dime qué datos quieres en el listbox.

Respuesta

Carlos, debes utilizar una función que está detallada en el siguiente artículo:

http://exceltotal.com/como-quitar-acentos-en-excel/ 


                    

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas