Excel 2010 - Remover caracteres de uma célula, o número de caracteres varia

0

Eu tenho uma lista exportada de outro aplicativo. Os resultados são retornados com caracteres extras entre eles.

O que eu ganho:

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

O que eu quero:

Mary One; Bob Two; Charles Three

O número de usuários que podem estar listados na célula não é consistente. O outro fator complicador é que os números variam entre 3 e 4 caracteres.

Estou tentando impedir que isso fique muito complicado. Idealmente, essa seria uma fórmula que eu comunicaria ao resto do meu departamento para usar conforme necessário.

Vou usar SUBSTITUTE e LEN, mas eu poderia usar alguma ajuda para manter isso limpo.

DeNaeL
fonte
DEVE ser uma fórmula? Criar uma função definida pelo usuário usando o RegEx seria uma maneira fácil de lidar com o problema. Porém, a distribuição da UDF pode representar dificuldades.
precisa saber é o seguinte
Deseja a resposta em uma célula ou em várias células? (Ou seja, A1 = cadeia longa, B1 = "Mary One;", C1 = "Bob two;" etc.)
bvaughn

Respostas:

2

Vou apresentar aqui algumas opções para escolher, mas todas elas se baseiam em expressões regulares. É possível não usar regex, mas acho que isso pode envolver um pouco mais de tempo.

[Opção 1 - https://regex101.com/]
Visite a página https://regex101.com/
Defina o sabor como 'pcre (php)' - é a opção padrão
Expressão regular: (?<=;)(#\d+;#)|(;#\d+$)Sinalizador: g
Cadeia de caracteres de teste: Mary One;#123;#Bob Two;#2345;#Charles Three;#445
Substituição: // um espaço (ou pode ser deixado em branco)
Saída: Mary One; Bob Two; Charles Three

A saída precisa ser cortada, pois há um espaço adicional no final.

[Opção 2 - LibreOffice Calc (portátil)]
A janela 'Localizar e substituir' do Calc permite o uso de expressões regulares.

Ctrl + H
Localizar: (?<=;)(#\d+;#)|(;#\d+$)
Substitua por: um espaço ou em branco
Na seção 'Outras opções', marque 'Expressões regulares'
Clique no botão 'Substituir tudo'.

[Opção 3 - Bloco de notas ++]
Estou mencionando N ++ aqui, pois é uma ferramenta realmente poderosa ao trabalhar com muitos tipos de textos. Seu poder está amplamente em vários plugins. Mas aqui vou me referir a uma janela Substituir padrão. O Regex permite dividir as partes correspondentes do texto. Isso é chamado de agrupamento. Cada grupo pode ter um nome e esse nome pode ser usado na substituição.

Ctrl + H → aba Substituir
Agrupar: marcado
Modo de pesquisa: Expressão regular
Encontre o que: (?'name_surname'[^;#]+\s[^;#]+;)(#\d+(;#|$))
Substitua por: $+{name_surname}
Clique no botão 'Substituir tudo'

Significado:
'Encontre o que' encontra tudo - o texto desejado e indesejado.
'Substituir por' substitui o texto bruto apenas pelas partes desejadas.

[Opção 4 - Excel - função definida pelo usuário (VBA)]
Abra o editor do Visual Basic (Alt + F11)
Adicionar referência:
Ferramentas -> Referências -> Expressões regulares do 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


[Resumo]
Tentei me concentrar em soluções bastante rápidas, mas totalmente funcionais, então acho que o sth pode ser extraído dela.

wlod
fonte
A opção 4 provou ser exatamente o que meus usuários precisam. Muito obrigado!
precisa saber é
Infelizmente, acabei de executá-lo em um novo relatório e ele será interrompido se houver mais de dois nomes. Na célula com um terceiro nome que eu tenho: Tom Kent; Julie Y Busse; # 562; DeNae Leverentz
DeNaeL
Eu acho que a principal diferença entre a string da pergunta e o comentário é que, no último, nem todos os nomes começam com o hash. Eu modificou a expressão regular, adicionando um ponto de interrogação que faz com que o hash opcional: Expr = "(#\d+;#?)|(;#\d+$)". A nova expressão ainda funciona com as seqüências anteriores. Se você encontrou alguns cenários mais negativos, provavelmente a causa raiz está no regex, mas felizmente isso pode ser facilmente alterado.
Wlod
Obrigado! Não encontrei outros cenários negativos!
precisa saber é
0

Eu tentei a fórmula. Não foi bonito. No entanto, tenho certeza de que existem outras maneiras de fazer isso.

Esta fórmula pegará sua seqüência na célula A1 e removerá as seqüências #123e #2345. Você sempre pode expandir ainda mais a técnica, se desejar. Ele encontra as ocorrências de "#" e depois divide a cadeia em pedaços menores.

=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)

Não é limpo nem facilmente transmissível.

Sugiro uma função definida pelo usuário. Aqui está um artigo explicando como configurar e distribuir uma função de usuário. Experimente a UDF e, se tiver alguma dúvida sobre o processo, pergunte.

B540Glenn
fonte