
Una lectora nos envió un archivo con algunos de esos caracteres raros y persistentes. Uno de ellos es el corazón ♥. El método usado para detectar (y luego, eliminar, estos caracteres) es compararlos con todos los caracteres que no correspondan a los caracteres “imprimibles” Es decir, aquellos cuyos códigos ASCII sean menores a 32 (el espacio en blanco) o mayores a 126 (el palito de la ñ):
Function SacaRaros(x)
largo = Len(x)
For i = 1 To Largo
letra = Mid(x, i, 1)
codigo = Asc(letra)
If codigo < 32 or codigo > 126 Then
Mid(x, i, 1) = “*”
End If
Next
SacaRaros = Replace(x, “*”, “”)
End Function
Esta macro comienza “midiendo” la longitud del dato a analizar (con la función Len). Luego recorre el dato letra por letra (con la función Mid) y toma nota de su código ASCII (con la función Asc). Si este código es menor a 32 o mayor a 126, lo reemplaza provisoriamente por un asterisco que luego reemplaza por un carácter nulo. La razón por la que no eliminamos el carácter extraño inmediatamente después de detectarlo, es que esto altera la longitud del dato (porque le estamos sacando un carácter) y complica su recorrido.
![Esta función debería eliminar todos los caracteres “raros” de la lista de nombres de la izquierda. No funciona correctamente en todos los casos, como con el corazón de la celda [B5].](https://www.redusers.com/noticias/wp-content/uploads/2015/11/OCT-01-440x228.jpg)
Esta función debería eliminar todos los caracteres “raros” de la lista de nombres de la izquierda. No funciona correctamente en todos los casos, como con el corazón de la celda [B5].
Según la función Asc, el código ASCII del corazón es el número 63 que, en realidad, corresponde al signo de pregunta. Ocurre que, con ese valor, la función no está diciendo que no entiende qué carácter es ese. Necesitamos una función capaz de identificar correctamente al corazón y otros caracteres raros. Esa función es AscW. Aplicada al corazón, la función AscW nos devuelve el código 9829. Si en nuestra función SacaRaros, reemplazamos Asc por AscW, la función identificará y reemplazará todos los caracteres raros que nos estén molestando.
para evitar el recorrido “raro”, es tan facil como hacer el recorrido del string desde el final del texto hacia el inicio, con step -1 en el for, con eso se evita el doble reemplazo acortando la ejecucion de la funcion.
El código es perfecto, y lo estoy usando con Ascw, el único inconveniente es que con el numero 0 ya que lo exime, y pues la idea es que ingresen toas las letras y los números, que recomendación me pueden brindar para que siga cumpliendo la misma función pero me agregue el 0,
Gracias
Hola, Quiero hacer este macro, pero me marca error, alguien me podra ayudar de favor? O como lo puedo hacer en excel o visual basic?
End Function SacaRaros = Replace(x, “*”, “”)Next End If Mid(x, i, 1) = “*” If codigo 126 Thencodigo = Asc(letra) letra = Mid(x, i, 1) For i = 1 To Largolargo = Len(x)Function SacaRaros(x)
Para los que necesiten la misma función pero en LibreOffice.
la diferencia es que hay que declarar las variables y difieren las comillas.
Function SacaRaros1 (dato as String) as string
dim largo as Integer
dim i as Integer
dim letra as String
Dim codigo as integer
largo = Len(dato)
For i = 1 To largo
letra = Mid(dato,i,1)
codigo =Asc (letra)
If codigo 126 Then Mid(dato, i, 1) = “*”
Next
SacaRaros1 = replace (dato,”*”,””)
End Function
por otra parte les dejo una función para pasar de números a letras.
y
otra para verificar CBU
http://www.taringa.net/posts/linux/19008769/Macros-importe-en-letras-Libreoffice.html