Estoy buscando tomar una cadena de texto y eliminar todo excepto los retornos de carro y el texto normal (por lo tanto, otros caracteres de control, espacios, viñetas y algunos otros trozos de basura). sin embargo

 CLEAN(A1) 

Tiras el carro también regresa.

He probado una cadena de anidadas

 SUBSTITUTE(A1, CHAR(000), "")
 SUBSTITUTE(A1, CHAR(001), "")

Etcetera

Pero sigue incumpliendo

 SUBSTITUTE(A1, CHAR(0), "")
 SUBSTITUTE(A1, CHAR(1), "")

Y dándome un error. ¿Alguna ayuda?

No tengo mucha experiencia en VBA, aunque pude reunir algunos conceptos básicos con un poco de búsqueda en Google.

3
P. Mann 14 dic. 2016 a las 17:15

2 respuestas

La mejor respuesta

Suponiendo que desea eliminar:

  • Caracteres ASCII del 0 al 9
  • Caracteres ASCII 11 y 12
  • Caracteres ASCII del 14 al 32
  • Caracteres ASCII 127 a 255

Luego considere la siguiente función definida por el usuario:

Public Function JunkKiller(S As String) As String
    Dim temp As String, a
    ary = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255)
    temp = S

    For Each a In ary
        temp = Replace(temp, Chr(a), "")
    Next a
    JunkKiller = temp
End Function

enter image description here

Esto retendrá tanto ASCII-10 como ASCII-13, si también desea retener el carácter de espacio, simplemente elimine el 32 de la declaración Array().

Las funciones definidas por el usuario (UDF) son muy fáciles de instalar y usar:

  1. ALT-F11 abre la ventana VBE
  2. ALT-I ALT-M abre un nuevo módulo
  3. pegue las cosas y cierre la ventana VBE

Si guarda el libro, el UDF se guardará con él. Si está utilizando una versión de Excel más tarde que 2003, debe guardar el archivo como .xlsm en lugar de .xlsx

Para eliminar el UDF:

  1. abrir la ventana VBE como se muestra arriba
  2. borrar el código
  3. cierra la ventana de VBE

Para usar el UDF de Excel:

=JunkKiller(A1)

Para obtener más información sobre las macros en general, consulte:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

Y

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

Y para detalles sobre UDF, ver:

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

¡Las macros deben estar habilitadas para que esto funcione!

2
Community 8 may. 2018 a las 21:49

Los retornos de carro son Char(13), que es 015 en octal. Pero probablemente también quieras Char(10) que es retorno de línea.

Los sustitutos anidados funcionan, pero de forma incómoda:

=...Substitute(Substitute(Substitute(A1,Char(1),""),Char(2),""),Char(3),"")...

Deberá sustituir Char(1) por Char(31) omitiendo Char(10) y Char(13).

Un método más sensato podría ser utilizar el código de nueva línea \n y el código de retorno de carro \r:

  1. Sustituye Char(10) por \n
  2. Sustituye Char(13) por \r
  3. Clean lo que queda
  4. Sustituye \n por Char(10)
  5. Sustituye \r por Char(13)

Esto fallaría si su entrada contiene \n o \r, obviamente.

=SUBSTITUTE(SUBSTITUTE(CLEAN(SUBSTITUTE(SUBSTITUTE(B1,CHAR(13),"\r"),CHAR(10),"\n")),"\r",CHAR(13)),"\n",CHAR(10))

¡Ahí, solo 4 Substitutes en lugar de 29!

2
Jack Deeth 14 dic. 2016 a las 14:59