Eliminar tildes

06/09/2006 - 17:41 por Esteban Dido | Informe spam
Hola,

¿Cómo se pueden eliminar los tildes de todos los datos de una columna?
Ej. si en la columna "A" tengo

lápiz
Calcetín
JABÓN
Atún
caFÉ

necesito que en la columna "B" aparezca

lapiz
Calcetin
JABON
Atun
caFE

Saludos
 

Leer las respuestas

#1 Vinchenzo vinç
07/09/2006 - 22:01 | Informe spam
"Esteban Dido" escribió en el mensaje news:
Gracias Francisco, adapté el código que me diste y funciona perfecto para lo
que necesitaba.



Hola Esteban,
como mínimo deberás añadir la diéresis, pues es una tilde imprescindible para -por ejemplo- escribir correctamente "averigüemos la ambigüedad lingüística"... estarás de acuerdo.

Pero dejando a un lado normas ortográficas de lenguas concretas, y si tu intención es -en efecto- "Eliminar tildes", yo ampliaría la búsqueda incluyendo hasta las producidas por errores del usuario al teclear, es decir, áààâéè..., la de la letra eñe se conservará, pues no tendría lógica eliminar su tilde.

Aquí tienes algunas opciones. Si realizas pruebas de rendimiento verás que la eficiencia varía inversamente proporcional en función de la longitud de la cadena. En todos los casos son -en términos de tiempos de respuesta- prácticamente iguales, en las máquinas que pululan hoy en día.

'==' Aplicable a NTs, 3.1 o superior:
' FoldString y la constante en la sección declaraciones del módulo que uses.
' Esta función, aplicando MAP_COMPOSITE, descompone un caracter.
' Por ejemplo: "informática" devolverá "informaŽtica", "eñe" devolverá "en~e", ...

Private Declare Function FoldString Lib "kernel32.dll" Alias "FoldStringA" ( _
ByVal dwMapFlags As Long, _
ByVal lpSrcStr As String, _
ByVal cchSrc As Long, _
ByVal lpDestStr As String, _
ByVal cchDest As Long) As Long

Private Const MAP_COMPOSITE As Long = &H40

' Luego aplicas una expresión regular que obtenga las tildes de interés, y se suprimen.
' Cuanto más larga sea la cadena, más rápida en comparación con otras opciones.
' Aparte, las expresiones regulares suele ser lo más efectivo en la manipulación de textos.

Public Function SinAcentos(ByVal strTexto As String) As String
Dim lngX As Long, strDestino As String

strDestino = String$(Len(strTexto) * 2, vbNullChar)
Call FoldString(MAP_COMPOSITE, strTexto, Len(strTexto), strDestino, Len(strDestino))
With CreateObject("VBScript.RegExp")
.MultiLine = True
.Global = True
.IgnoreCase = False
.Pattern = "Ž|`|š|\^"
SinAcentos = .Replace(strDestino, vbNullString)
SinAcentos = Left$(SinAcentos, InStr(1, SinAcentos, vbNullChar) - 1)
SinAcentos = Replace(SinAcentos, "n~", "ñ") 'Conservemos la eñe...
SinAcentos = Replace(SinAcentos, "N~", "Ñ")
End With
End Function
'==

'**********************************
' Esta otra opción, aproximadamente, con 50.000 caracteres comienza
' a ser igualada-adelantada por la primera opción (en mi banco de pruebas).

Private Function SinAcentos(ByVal sCadena As String) As String
SinAcentos = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace( _
Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace( _
Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace( _
Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace( _
Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace( _
sCadena, "á", "a"), "à", "a"), "à", "a"), "â", "a"), _
"Á", "A"), "À", "A"), "Ä", "A"), "Â", "A"), _
"é", "e"), "è", "e"), "ë", "e"), "ê", "e"), _
"É", "E"), "È", "E"), "Ë", "E"), "Ê", "E"), _
"í", "i"), "ì", "i"), "ï", "i"), "î", "i"), _
"Í", "I"), "Ì", "I"), "Ï", "I"), "Î", "I"), _
"ó", "o"), "ò", "o"), "ö", "o"), "ô", "o"), _
"Ó", "O"), "Ò", "O"), "Ö", "O"), "Ô", "O"), _
"ú", "u"), "ù", "u"), "ü", "u"), "û", "u"), _
"Ú", "U"), "Ù", "U"), "Ü", "U"), "Û", "U")
End Function
'**********************************


'=' Esta es la menos eficiente, pero es la que se te ejecutará en más sistemas.
' Puede servir de alternativa para "versiones antiguas" en las que todavía no estaba
' implementada la función de cadena "Replace":

Private Function SinAcentos(ByVal sCadena As String) As String
Dim lngX As Long

For lngX = 1 To Len(sCadena)
Select Case Mid$(sCadena, lngX, 1)
Case "á", "à", "à", "â": Mid$(sCadena, lngX, 1) = "a"
Case "Á", "À", "Ä", "Â": Mid$(sCadena, lngX, 1) = "A"
Case "é", "è", "ë", "ê": Mid$(sCadena, lngX, 1) = "e"
Case "É", "È", "Ë", "Ê": Mid$(sCadena, lngX, 1) = "E"
Case "í", "ì", "ï", "î": Mid$(sCadena, lngX, 1) = "i"
Case "Í", "Ì", "Ï", "Î": Mid$(sCadena, lngX, 1) = "I"
Case "ó", "ò", "ö", "ô": Mid$(sCadena, lngX, 1) = "o"
Case "Ó", "Ò", "Ö", "Ô": Mid$(sCadena, lngX, 1) = "O"
Case "ú", "ù", "ü", "û": Mid$(sCadena, lngX, 1) = "u"
Case "Ú", "Ù", "Ü", "Û": Mid$(sCadena, lngX, 1) = "U"
End Select
Next
SinAcentos = sCadena
End Function
'=
Hay otras opciones... Pero, en general, deberías intentar evitar el uso de tipos "Variant", y en eso te ayudaría tener activada la "Declaración explícita de variables requerida" (Option Explicit).

Saludos
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/micr...c.es.excel
( i ) Temperancia en el foro:
http://support.microsoft.com/defaul...newsreglas

Preguntas similares