Esta questão é um desdobramento de uma pergunta anterior:Fórmula Excel - fórmula de separação de nomes para pessoas que possuem sobrenomes com várias partes:.
Contexto
Tenho uma lista de mais de 20.000 contatos onde existe uma única coluna “Nome completo”. Preciso criar duas colunas para Nome e Sobrenome. No entanto, nem todos os nomes se enquadram nesse padrão simples. A lista inclui nomes como:
David Batte
Guy-Mael Jacobe de Naurois
Jean-Marc Lioutier
Thibaud Le Seguillon
Mrs. Manuela Junghaehnel
Hussain Mohammed Dipu Kabir
Como resultado da pergunta anterior, estou atacando o problema retirando coleções de nomes que se ajustam a padrões específicos aos quais posso aplicar regras de análise apropriadas. Um número relativamente pequeno de padrões me permitirá automatizar a análise da maior parte da lista, tornando o restante uma tarefa mais gerenciável.
Essa questão
Uma parte substancial da lista de nomes completos contém apenas um nome e um sobrenome, que são fáceis de analisar. Meu objetivo com esta pergunta é identificar esses nomes com dois nomes para que possam ser separados do resto da lista.
Responder1
Existem várias maneiras de identificar casos em que os nomes em uma lista contêm apenas dois nomes de componentes, como nome e sobrenome. Essa condição é definida pelos espaços que separam os nomes dos componentes.
Método 1
Esta questão é um desdobramento de uma anterior (Fórmula Excel - fórmula de separação de nomes para pessoas que possuem sobrenomes com várias partes:), onde já discutimos nos comentários a identificação de casos de um único nome, como apenas nome ou sobrenome. Se você já removeu esses nomes da lista, para que cada entrada tenha pelo menos dois nomes, você pode usar uma técnica semelhante aqui e desenvolvê-la.
Esta abordagem procura um espaço e, a partir daí, procura outro espaço. Se conseguir encontrar um segundo espaço, a entrada terá mais de dois nomes de componentes. Se a entrada estiver em A1, a fórmula básica seria:
=FIND(" ",TRIM(A1),FIND(" ",TRIM(A1))+1)
O resultado disso será um número (localização do próximo espaço) ou um #VALUE! erro se não houver um. O valor que! o erro será fácil de detectar e identifica entradas com dois nomes. Observe que ele também identificará entradas de nome único, e é por isso que esse método só funcionará se você já as tiver removido.
Você pode tornar isso mais atraente visualmente testando o resultado para a condição de erro e exibindo uma mensagem de texto para os casos de dois nomes ou um espaço em branco. Envolver a fórmula acima em um teste IF resultaria em uma fórmula como esta:
=IF(ISERROR(FIND(" ",TRIM(A1),FIND(" ",TRIM(A1))+1)),"Just 2","")
Método 2
Outra abordagem é contar os espaços. Na verdade, você poderia usar essa abordagem para encontrar qualquer número específico de espaços; portanto, apenas alterar a contagem de destino permitiria encontrar também as entradas de nome único. Essa abordagem conta espaços eliminando todos os espaços e vendo quantos caracteres a string diminui. A comparação de comprimento produz a contagem de espaços. Você envolve isso com um teste IF para fazer o que quiser com o número resultante. A fórmula para sinalizar entradas com dois nomes (ou seja, espaço único) seria semelhante a esta:
=IF(LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))=1,"Just 2","")
Responder2
Vou deixar um método mais simples quepode não ser o idealpara 20.000 linhas.
- Divida os nomes por espaços usando Dados -> Texto para Colunas
- Os nomes serão divididos em quatro colunas A, B, C e D
- clique em filtrar e filtrar
blanks
na coluna C - você terá apenas os nomes das duas palavras exibidas em A e B. copie-os.
- você pode juntar os nomes usando
=TEXTJOIN(" ",TRUE,A1:B1)
Responder3
Gostaria de sugerir dois métodos possíveis, o primeiro é o Non VBA e o outro é o VBA.
Método 1:
Como funciona:
- Insira esta fórmula na célula
H2
para criar valores auxiliares (Identifique partes dos nomes) e preencha-o.
=LEN(G2)-LEN(SUBSTITUTE(G2," ",""))
- Escreva critérios
2
na célulaH1
. Insira esta fórmula de matriz em Cell
I2
e termine comCtrl+Shift+Entere preencha.{=IFERROR(INDEX($G$2:$G$14,SMALL(IF(H$1=$H$2:$H$14,ROW($G$2:$G$14)- MIN(ROW($G$2:$G$14))+1,""), ROW()-1)),"")}
Observação
- Ao alterar os critérios na célula
H1
para1
ou3
você pode obter uma lista de dois ou mais nomes de peças.
Método 2:
Como você está lidando com mais de 20.000 linhas, o VBA (Macro) será o método mais rápido para concluir o trabalho.
Como funciona:
- Clique com o botão direitoGuia da planilha e clique no menu pop-upVer códigopara obter o editor VB.
Copiar colareste código como módulo padrão e, finalmenteCORRERa Macro.
Sub DeleteMorethan2() Dim r As Integer, c As Integer, space_count As Integer For r = 2 To 15 space_count = 0 For c = 1 To Len(Range("A" & r)) If Mid(Range("A" & r), c, 1) = " " Then space_count = space_count + 1 If space_count > 1 Then Range("A" & r).ClearContents Next Next End Sub
Você entende isso:
Observação
- Este código está funcionando
Rows 2 to 15
e editando esta parteFor r = 2 To 15
, você pode incluir mais linhas. - A coluna usada é
A
, que também é editável.
Além disso, gostaria de sugerir uma fórmula de matriz para recriar a lista de nomes removendo as linhas em branco.
Insira esta fórmula de matriz em Cell
B2
e termine comCtrl+Shift+Entere preencha.{=IFERROR(INDEX(A$2:A$14,SMALL(IF(A$2:A$14<>"",ROW(A$2:A$14)-ROW(A$2)+1),ROWS(B$2:B2))),"")}
Ajuste as referências de células na fórmula conforme necessário.