Como posso realizar uma pesquisa de seqüência inversa no Excel sem usar VBA?

StackOverflow https://stackoverflow.com/questions/350264

  •  20-08-2019
  •  | 
  •  

Pergunta

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

Usando construído em funções do Excel (sem VBA), há uma maneira de isolar a última palavra em cada corda?

Exemplos:

  Are you classified as human? -> human?
Negative, I am a meat popsicle -> popsicle
                  Aziz! Light! -> Light!
Foi útil?

Solução

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

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

Se as cordas originais poderiam conter um pipe "|" personagem, em seguida, substituir tanto no acima com algum outro personagem que não vai aparecer na sua fonte. (Eu suspeito original de Brad foi quebrado porque um carácter não imprimível foi removido na tradução).

Bonus: Como funciona (da direita para a esquerda):

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

EDIT: para a conta para 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 sintaxe =IF(COUNTIF(A1,"* *") da outra versão.

Quando a string original pode conter um espaço na última posição adicionar uma função caimento ao contar todos os espaços: Fazendo a função a seguir:

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

Outras dicas

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

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

Para obter a primeira palavra em uma corda, basta mudar da direita para esquerda

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

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

Uma versão mais robusta de resposta de Jerry:

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

Isso funciona independentemente do comprimento da corda, espaços antes ou depois, ou qualquer outra coisa e ainda é muito curta e simples.

este no google, testado em Excel 2003 e ele 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)

[editar] Eu não tenho rep suficiente para comentário, por isso, este parece ser o melhor lugar ... A resposta de BradC também não funciona com espaços à direita ou células vazias ...
[2 editar] Na verdade, ele não funciona para palavras isoladas ou ...

=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)

Este é muito robusto - ele funciona para frases sem espaços, levando / espaços à direita, múltiplos espaços, levando múltipla / espaços à direita ... e eu usei char (7) para o delimitador, em vez da barra vertical "| " apenas no caso de que é um item de texto desejado.

Este é muito limpo e compacto, e funciona bem.

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

Não faz interceptação de erro para sem espaços nem uma palavra, mas isso é fácil de adicionar.

Editar:
Este alças espaços à direita, uma única palavra, 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)))}
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 

Para adicionar respostas de Jerry e Joe, se você está querendo encontrar o texto antes da última palavra que você pode usar:

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

Com 'Meu pequeno gato' em A1 resultaria em 'My little' (onde Joe e Jerry daria 'gato'

Da mesma forma que Jerry e Joe isolar a última palavra, este então só fica tudo para a esquerda de que (então apara-lo de volta)

Imagine a corda poderia ser revertida. Em seguida, ele é 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) na A2 você começa "My" com (1) e "tac" com (2), que é "cat" invertida, a última palavra em (1).

Há alguns VBAs torno de inverter uma string. Eu prefiro a função pública VBA ReverseString .

Instale o acima descrito. Então, com sua seqüência na 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 parte do princípio de que as palavras são separados por espaços em branco. A cláusula IF é para células contendo palavras únicas = não há espaços em branco na célula. Nota: TRIM e CLEAN a string original são úteis também. Em princípio, ele inverte a seqüência inteira de A1 e simplesmente encontra o primeiro em branco na string invertida que fica ao lado a última palavra (invertida) (ou seja, "tac "). LEFT escolhe esta palavra e outra reversão corda reconstitui a ordem original da palavra (" cat"). O -1 no final da declaração FIND remove o espaço em branco.

A idéia é que ele é fácil de extrair o primeiro (!) De palavras em uma string com LEFT e FINDing o primeiro em branco. No entanto, para o último (!) Palavra a função RIGHT é a escolha errada quando você tenta fazer isso porque, infelizmente FIND não tem uma bandeira para a direção que você quer analisar a sua string.

Portanto, toda a cadeia é simplesmente invertida. LEFT e FIND trabalho como normal, mas a corda extraído é invertida. Mas o seu não é grande coisa quando você sabe como reverter uma corda. A primeira declaração ReverseString na fórmula faz este trabalho.

=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)

Copiar em uma coluna, selecione a coluna e HOME> Editar> Localizar e Selecionar, Substituir:

Localizar:

Substituir Tudo .

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

I traduzido para PT-BR, como eu precisava disso também.

(Note que eu mudei o espaço para \ porque eu precisava de apenas o nome do de strings 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,"\",""))))))

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

enter descrição da imagem aqui

Eu também tinha uma tarefa como esta e quando eu estava feito, usando o método acima, um novo método ocorreu-me: Por que você não fazer isso:

  1. Inverter a string ( "uma string" se torna "gnirts eno").
  2. Use o bom encontrar velhos (que é codificado para a esquerda para a direita).
  3. revertê-la em seqüência legível novamente.

Como é que este som?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top