Excel 2010: elimine caracteres de una celda, el número de caracteres varía

0

Tengo una lista exportada desde otra aplicación. Los resultados se devuelven con caracteres adicionales entre ellos.

Lo que consigo:

Mary One;#123;#Bob Two;#2345;#Charles Three;#445

Lo que quiero:

Mary One; Bob Two; Charles Three

El número de usuarios que podrían aparecer en la celda no es consistente. El factor de complicación adicional es que los números varían entre 3 y 4 caracteres.

Estoy tratando de evitar que esto se vuelva muy complicado. Idealmente, esta sería una fórmula que comunicaría al resto de mi departamento para usar según sea necesario.

Voy a usar SUBSTITUTE y LEN, pero podría necesitar ayuda para mantenerlo limpio.

DeNaeL
fuente
¿DEBE ser una fórmula? Crear una función definida por el usuario utilizando RegEx sería una manera fácil de resolver el problema. Sin embargo, distribuir el UDF podría plantear dificultades.
B540Glenn
¿Desea la respuesta en una celda o en varias celdas? (Es decir, A1 = cadena larga, B1 = "Mary One;", C1 = "Bob two;", etc.
bvaughn

Respuestas:

2

Voy a presentar aquí un par de opciones para elegir, pero todas ellas se basan en expresiones regulares. Es posible no usar expresiones regulares, pero creo que podría requerir un poco más de tiempo.

[Opción 1 - https://regex101.com/]
Visite la página https://regex101.com/
Establezca el sabor en 'pcre (php)' - es la opción predeterminada
Expresión regular: (?<=;)(#\d+;#)|(;#\d+$)Bandera: g
Cadena de prueba: Mary One;#123;#Bob Two;#2345;#Charles Three;#445
Sustitución: // un espacio (o puede dejarse en blanco)
Salida: Mary One; Bob Two; Charles Three

la salida debe recortarse ya que hay un espacio adicional al final.

[Opción 2 - LibreOffice Calc (portátil)]
La ventana 'Buscar y reemplazar' de Calc permite usar expresiones regulares.

Ctrl + H
Buscar: (?<=;)(#\d+;#)|(;#\d+$)
Reemplazar con: un espacio o en blanco
En la sección 'Otras opciones' marque 'Expresiones regulares'
Haga clic en el botón 'Reemplazar todo'.

[Opción 3 - Notepad ++]
Estoy mencionando N ++ aquí ya que es una herramienta realmente poderosa mientras trabajo con muchos tipos de textos. Su poder se encuentra en gran medida en numerosos complementos. Pero aquí me referiré a una ventana Reemplazar estándar. Regex permite dividir las partes coincidentes del texto. Se llama agrupación. Cada grupo puede tener un nombre y ese nombre puede usarse en el reemplazo.

Ctrl + H → Reemplazar pestaña
Ajustar: marcado
Modo de búsqueda: Expresión regular
Buscar: (?'name_surname'[^;#]+\s[^;#]+;)(#\d+(;#|$))
Reemplazar con: $+{name_surname}
Haga clic en el botón 'Reemplazar todo'

Significado:
'Buscar qué' encuentra todo: el texto deseado y no deseado.
'Reemplazar con' reemplaza el texto sin formato con solo partes deseadas.

[Opción 4 - Excel - función definida por el usuario (VBA)]
Abra el editor de Visual Basic (Alt + F11)
Agregue referencia:
Herramientas -> Referencias -> Expresiones regulares de Microsoft VBScript 5.5

Option Explicit
Function leaveNames(CellValue As Variant)
    Dim RegEx As RegExp
    Dim Expr As String
    Set RegEx = New RegExp
    Expr = "(#\d+;#)|(;#\d+$)"
    RegEx.Global = True
    RegEx.IgnoreCase = False
    RegEx.MultiLine = False
    RegEx.Pattern = Expr
    leaveNames = RegEx.Replace(CellValue, "")
End Function


[Resumen]
Traté de concentrarme en soluciones bastante rápidas pero totalmente funcionales, así que supongo que se puede sacar algo de eso.

wlod
fuente
La opción 4 ha demostrado ser exactamente lo que necesitan mis usuarios. ¡Muchas gracias!
DeNaeL
Desafortunadamente, lo ejecuté en un nuevo informe y se rompe si hay más de 2 nombres. En la celda con un tercer nombre obtuve: Tom Kent; Julie Y Busse; # 562; DeNae Leverentz
DeNaeL
Creo que la diferencia clave entre la cadena de la pregunta y el comentario es que en este último no todos los nombres comienzan con el hash. He modificado la expresión regular mediante la adición de un signo de interrogación que hace que el hash opcional: Expr = "(#\d+;#?)|(;#\d+$)". La nueva expresión todavía funciona con las cadenas anteriores. Si encontró algunos escenarios más negativos, lo más probable es que la causa raíz se encuentre en la expresión regular, pero afortunadamente esto se puede cambiar fácilmente.
wlod
¡Gracias! ¡No he encontrado ningún otro escenario negativo!
DeNaeL
0

Intenté la fórmula. No fue lindo. Sin embargo, estoy seguro de que hay otras formas de hacerlo.

Esta fórmula tomará su cadena en la celda A1 y eliminará las cadenas #123y #2345. Siempre puede ampliar la técnica aún más si lo desea. Encuentra las ocurrencias de "#" y luego divide la cadena en pedazos más pequeños.

=LEFT(A1,SEARCH("#",A1,1)-1) &  MID(RIGHT(A1,LEN(A1)-SEARCH("#",A1,1)),SEARCH("#",RIGHT(A1,LEN(A1)-SEARCH("#",A1,1)),1)+1,SEARCH("#",MID(RIGHT(A1,LEN(A1)-SEARCH("#",A1,1)),SEARCH("#",RIGHT(A1,LEN(A1)-SEARCH("#",A1,1)),1)+1,LEN((A1))),1)-1)

No es limpio ni fácil de comunicar.

Sugiero una función definida por el usuario. Aquí hay un artículo que explica cómo configurar y distribuir una función de usuario. Pruebe el UDF y si tiene preguntas sobre el proceso, por favor pregunte.

B540Glenn
fuente