Como posso executar uma pesquisa de seqüência reversa no Excel sem usar o VBA?

165

Eu tenho uma planilha do Excel que contém uma lista de seqüências de caracteres. Cada string é composta de várias palavras, mas o número de palavras em cada string é diferente.

Usando funções internas do Excel (sem VBA), existe uma maneira de isolar a última palavra em cada string?

Exemplos:

  Você é classificado como humano? -> humano?
Negativo, eu sou um picolé de carne -> picolé
                  Aziz! Luz! -> Luz!
e.James
fonte
4
Eu estou querendo saber por que você tem a restrição artificial sem VBA?
EBGreen
3
Posso resolvê-lo facilmente com o VBA, mas estou curioso para saber se há uma solução que não seja do VBA. O VBA tende a ter penalidades de desempenho para grandes conjuntos de dados.
e.James
Como sempre, duas respostas realmente se destacam e tenho dificuldade em decidir qual delas escolher como a resposta correta. Nesse caso, Jon e BradC (com a ajuda de Brad) apresentaram soluções corretas e funcionais.
e.James
Eu selecionei a solução de BradC porque parece ser a mais elegante das duas, e ele fornece uma explicação útil da função.
e.James
É difícil responder sua pergunta corretamente se você não indicar o que torna o VBA inadequado (já que você pode escrever suas próprias macros e funções no VBA, tornando-o equivalente às funções internas).
dkretz

Respostas:

208

Este é testado e funciona (com base no post original de Brad):

=RIGHT(A1,LEN(A1)-FIND("|",SUBSTITUTE(A1," ","|",
     LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

Se suas strings originais pudessem conter um pipe "|" caractere, substitua os dois acima por outro caractere que não aparecerá na sua fonte. (Eu suspeito que o original de Brad estava quebrado porque um caractere não imprimível foi removido na tradução).

Bônus: Como funciona (da direita para a esquerda):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- Contagem de espaços na cadeia original
SUBSTITUTE(A1," ","|", ... )- Substitui apenas a final espaço por a |
FIND("|", ... )- Encontra a posição absoluta da substituída |(que era o espaço final)
Right(A1,LEN(A1) - ... ))- Retorna todos os caracteres depois disso|

EDIT: para explicar o caso em que o texto de origem não contém espaços, adicione o seguinte ao início da fórmula:

=IF(ISERROR(FIND(" ",A1)),A1, ... )

fazendo a fórmula inteira agora:

=IF(ISERROR(FIND(" ",A1)),A1, RIGHT(A1,LEN(A1) - FIND("|",
    SUBSTITUTE(A1," ","|",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))))

Ou você pode usar a =IF(COUNTIF(A1,"* *")sintaxe da outra versão.

Quando a sequência original puder conter um espaço na última posição, adicione uma função de recorte ao contar todos os espaços: Tornando a função o seguinte:

=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
    SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))
BradC
fonte
1
Não posso agradecer o suficiente. Também precisava do resto da string, então simplesmente mudar = DIREITA para = ESQUERDA e remover LEN (A1) - me permitia obter o resto. Mas obrigado por fazer todo o trabalho inicial perna :)
Luke Duddridge
4
+1: Vou ter que lembrar o truque "LEN (A1) -LEN (SUBSTITUTE (A1," "," "))" para obter o número de instâncias de um personagem
anschauung
2
Excelente solução! O único problema é que o Excel localiza nomes de funções, portanto, é necessário reescrever a fórmula do Excel que não está em inglês. Aqui está a variante reescrita para a russa: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "|"; ДЛСТР (A1) -ДЛСТР (A1) - ""; "")))))
Michael Pliskin 28/11
Esta resposta quebra em cadeias contendo espaços consecutivos.
somewhatsapient
1
Eu recomendaria dividir as fórmulas em colunas temporárias (você pode ocultá-las mais tarde). É muito útil para depurar casos especiais.
wisbucky
84

Esta é a técnica que usei com grande sucesso:

=TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))

Para obter a primeira palavra em uma string, mude de DIREITA para ESQUERDA

=TRIM(LEFT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))

Além disso, substitua A1 pela célula que contém o texto.

Jerry Beaucaire
fonte
2
Funciona para mim - apenas substituí o primeiro " "pelo meu delimitador. Os dois 100s parecem limitá-lo a uma série de 100 caracteres, se não me engano
Benjineer
1
Se usarmos um delimitador diferente, também precisamos remover isso no final, por exemplo:=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad 31/07/2015
7
Método muito inteligente. O que ele faz é substituir todos os espaços por 100 espaços e retornar os últimos 100 caracteres sem espaços à esquerda / à direita.
Zenadix 21/08/2015
@ Benjineer Acho que funciona para strings com muito mais de 100 caracteres. Os 100 caracteres limitam o tamanho de uma única palavra. Você está usando os cem caracteres à direita (ou à esquerda) ... se uma palavra de 101 caracteres tiver um problema, mas se uma sequência de 100 caracteres ... com 3 espaços ... for preenchido com aproximadamente uma seqüência de caracteres de 400 caracteres e ainda funciona. Para Jerry Beaucaire - Muito elegante, obrigado.
Tin Bum
22

Uma versão mais robusta da resposta de Jerry:

=TRIM(RIGHT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))

Isso funciona independentemente do comprimento da string, espaços iniciais ou finais, ou qualquer outra coisa, e ainda é bem curto e simples.

Joe Finkle
fonte
2
É uma excelente fórmula. Modifiquei a fórmula =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))para obter a extensão do arquivo.
Adarsh ​​Madrecha
2
Mais um SUBSTITUTEpermite que ele funcione para qualquer personagem, não apenas para espaços. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), onde "/" é o caractere delimitante.
PProteus
@ Joefinkle, esta é uma solução realmente concisa e inteligente. Ele funciona muito bem, apenas para mencionar que, se o delimitador é uma string que não funciona bem em todos os casos, aqui um exemplo de um delimitador: " ; "(um ponto e vírgula rodeado por espaços) com valor de entrada: "Technology Sprint 24 ; Sprint 4"ele retorna: "; Sprint 4". Estou usando a solução adicionada por: @PProteus.
David Leal
Se o delimitador for uma string, uma possível solução alternativa seria substituí-lo antes por algum caractere especial, por exemplo, substituindo na fórmula @PProteus TRIM(A1)por: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))em todos os lugares, para ter um novo delimitador de caracteres: ";"ou melhor ainda, usando a char()função para encontrar algum personagem realmente inesperado.
David Leal
1
@PProteus, você não precisa da TRIMfunção depois de adicionar a segunda SUBSTITUTEpara a solução geral de caracteres únicos. A fórmula fornece o resultado esperado, eliminando esta parte:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal
13

Encontrei isso no google, testado no Excel 2003 e funciona para mim:

=IF(COUNTIF(A1,"* *"),RIGHT(A1,LEN(A1)-LOOKUP(LEN(A1),FIND(" ",A1,ROW(INDEX($A:$A,1,1):INDEX($A:$A,LEN(A1),1))))),A1)

[edit] Eu não tenho representante suficiente para comentar, então esse parece o melhor lugar ... A resposta de BradC também não funciona com espaços à direita ou células vazias ...
[2ª edição] na verdade, não funciona para palavras simples também ...

Jon
fonte
Solução mais próxima ainda, mas eu usaria um Trim (), pois um espaço à direita o quebrará.
EBGreen
É verdade que provavelmente é mais fácil aparar () em uma célula intermediária e depois aplicar a fórmula acima na célula intermediária. Além disso, expelir 0 se a célula passa a ser vazia, de modo que também pode ser embrulhado com ISBLANK ()
Jon
3
=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)

Isso é muito robusto - funciona para frases sem espaços, espaços iniciais / finais, múltiplos espaços, vários espaços iniciais / finais ... e usei char (7) para o delimitador, em vez da barra vertical "|" apenas no caso de ser um item de texto desejado.

Mark Main
fonte
Funciona para mim no Excel 2010. Graças
Rudiger Lobo
2

Isso é muito limpo e compacto e funciona bem.

{=RIGHT(A1,LEN(A1)-MAX(IF(MID(A1,ROW(1:999),1)=" ",ROW(1:999),0)))}

Ele não trava erros por nenhum espaço ou uma palavra, mas é fácil de adicionar.

Editar:
trata de espaços à direita, palavra única e cenários de células vazias. Eu não encontrei uma maneira de quebrá-lo.

{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}
gabrielu
fonte
Legal. Esse é um uso realmente interessante de funções de matriz! Eu não esperava receber outra resposta depois de tanto tempo. Obrigado por compartilhar.
e.James
2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
Cody Gray
fonte
Você testou? Não funciona para mim com "Você está classificado como humano?"
Ed Guiness
Não, não funciona. Tem alguns elementos interessantes, no entanto. LEN (A1) -LEN (SUBSTITUTE (A1, "", "")) fornece a contagem de espaços na cadeia de caracteres.
BradC
Essa é uma função interessante. Pena que não funciona. Eu gosto do truque para poder contar o número de espaços.
e.James
@ Brad: Eu editei sua postagem para mostrar os caracteres *. O original não os imprimiu corretamente. Com estes no lugar, ele funciona. 1
e.James
2

Para adicionar às respostas de Jerry e Joe, se você deseja encontrar o texto ANTES da última palavra, pode usar:

=TRIM(LEFT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))))-LEN(TRIM(A1))))

Com 'Meu gatinho' em A1 resultaria em 'Meu gatinho' (onde Joe e Jerry's dariam 'gato'

Da mesma forma que Jerry e Joe isolam a última palavra, isso apenas coloca tudo à esquerda disso (depois apara)

Andrew B
fonte
1

Imagine que a corda possa ser revertida. Então é realmente fácil. Em vez de trabalhar na string:

"My little cat" (1)

você trabalha com

"tac elttil yM" (2)

Com =LEFT(A1;FIND(" ";A1)-1)em A2 você obtém "My"com (1) e "tac"com (2), que é invertido"cat" , a última palavra em (1).

Existem alguns VBAs ao redor para reverter uma string. Eu prefiro a função pública do VBA ReverseString.

Instale o descrito acima, como descrito. Depois, com sua string em A1, por exemplo, "My little cat"e esta função em A2:

=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1));
  LEN(A1);(FIND(" ";ReverseString(A1))-1))))

você verá "cat"na A2.

O método acima pressupõe que as palavras são separadas por espaços em branco. A IFcláusula é para células que contêm palavras únicas = sem espaços em branco na célula. Nota: TRIMe CLEANa sequência original também é útil. Em princípio, ele reverte toda a cadeia de caracteres de A1 e simplesmente encontra o primeiro espaço em branco na cadeia de reversão que fica ao lado da última palavra (invertida) (ou seja, "tac "). LEFTescolhe essa palavra e outra reversão de string reconstitui a ordem original da palavra ( " cat"). O -1no final doFIND instrução remove o espaço em branco.

A idéia é que é fácil extrair a primeira (!) Palavra em uma string com LEFTe FINDno primeiro espaço em branco. No entanto, para a última (!) Palavra, oRIGHT função é a escolha errada quando você tenta fazer isso porque, infelizmente, o FIND não possui um sinalizador para a direção em que você deseja analisar sua string.

Portanto, toda a cadeia é simplesmente revertida. LEFTe FINDtrabalhe normalmente, mas a cadeia extraída é invertida. Mas o dele não é grande coisa quando você sabe como reverter uma string. A primeira ReverseStringdeclaração na fórmula faz esse trabalho.

Ralf
fonte
Isso é muito mais simples do que todas as outras opções aqui, muito obrigado! Por que o Find não pode ter um achado inverso, ou substituto - parece que me lembro de algo a ver com o uso de um número negativo para fazer a pesquisa reversa, mas claramente não vba ... #
31717 Craig
3
O OP não solicitou VBA.
Tripp Kinetics
Também isso é loucura! Se você estiver usando o VBA, poderá facilmente encontrar um achado inverso #
Denzil Newman
1
=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)
JB
fonte
1

Copie para uma coluna, selecione-a e HOME> Edição> Localizar e selecionar, Substituir:

Encontre o que:

Replace All.

Há um espaço após o asterisco.

nozes
fonte
Note-se que * é um (gananciosos) curinga em pesquisas de Excel, de modo que este partidas tudo até o último espaço e substitui-lo com nada
Superfly Jon
0

Traduzi para o PT-BR, pois precisava disso também.

(Observe que mudei o espaço para \porque precisava do nome do arquivo apenas de cadeias de caminho.)

=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))
Marcelo
fonte
3
Eu não sei como ler Excel em Português, então eu vou ter que levar sua palavra para ela :)
e.James
0

Outra maneira de conseguir isso é como abaixo

=IF(ISERROR(TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14))))),TRIM(D14),TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14)))))

insira a descrição da imagem aqui

Karthick Gunasekaran
fonte
-1

Eu também tive uma tarefa como essa e, quando terminei, usando o método acima, ocorreu um novo método: Por que você não faz isso:

  1. Inverta a string ("string one" se torna "eno gnirts").
  2. Use o bom e velho Find (que é codificado para a esquerda para a direita).
  3. Inverta-o em sequência legível novamente.

Como isso soa?

Tod Heartsound
fonte
12
Certo. Mas como você reverte a string no Excel?
e.James