Come posso eseguire una ricerca di stringhe inverse in Excel senza usare VBA?
-
20-08-2019 - |
Domanda
Ho un foglio di calcolo Excel che contiene un elenco di stringhe. Ogni stringa è composta da più parole, ma il numero di parole in ciascuna stringa è diverso.
Utilizzando le funzioni di Excel integrate (senza VBA), c'è un modo per isolare l'ultima parola in ogni stringa?
Esempi:
Are you classified as human? -> human? Negative, I am a meat popsicle -> popsicle Aziz! Light! -> Light!
Soluzione
Questo è testato e funziona (basato sul post originale di Brad):
=RIGHT(A1,LEN(A1)-FIND("|",SUBSTITUTE(A1," ","|",
LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))
Se le tue stringhe originali potrebbero contenere una pipe " | " carattere, quindi sostituisci entrambi i precedenti con qualche altro personaggio che non verrà visualizzato nella tua fonte. (Sospetto che l'originale di Brad sia stato rotto perché nella traduzione è stato rimosso un personaggio non stampabile).
Bonus: come funziona (da destra a sinistra):
LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
& # 8211; Conteggio degli spazi nella stringa originale
SUBSTITUTE(A1," ","|", ... )
& # 8211; Sostituisce solo lo spazio finale con un |
FIND("|", ... )
& # 8211; Trova la posizione assoluta di quella sostituita Right(A1,LEN(A1) - ... ))
(quello era lo spazio finale)
=IF(COUNTIF(A1,"* *")
& # 8211; Restituisce tutti i caratteri dopo quello <=>
MODIFICA: per tenere conto del caso in cui il testo di origine non contiene spazi, aggiungi quanto segue all'inizio della formula:
=IF(ISERROR(FIND(" ",A1)),A1, ... )
rendendo l'intera formula ora:
=IF(ISERROR(FIND(" ",A1)),A1, RIGHT(A1,LEN(A1) - FIND("|",
SUBSTITUTE(A1," ","|",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))))
Oppure puoi utilizzare la <=> sintassi dell'altra versione.
Quando la stringa originale potrebbe contenere uno spazio nell'ultima posizione, aggiungere una funzione di taglio mentre si contano tutti gli spazi: Rendere la funzione la seguente:
=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))
Altri suggerimenti
Questa è la tecnica che ho usato con grande successo:
=TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))
Per ottenere la prima parola in una stringa, passa da DESTRA a SINISTRA
=TRIM(LEFT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))
Inoltre, sostituisci A1 con la cella che contiene il testo.
Una versione più solida della risposta di Jerry:
=TRIM(RIGHT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))
Funziona a prescindere dalla lunghezza della stringa, dagli spazi iniziali o finali o da qualsiasi altra cosa ed è ancora piuttosto breve e semplice.
Ho trovato questo su google, testato in Excel 2003 & amp; funziona per me:
=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)
[modifica] Non ho abbastanza rappresentante per commentare, quindi questo sembra il posto migliore ... Anche la risposta di BradC non funziona con spazi finali o celle vuote ...
[2a modifica] in realtà, non funziona nemmeno per singole parole ...
=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)
Questo è molto robusto - funziona per frasi senza spazi, spazi iniziali / finali, spazi multipli, spazi multipli iniziali / finali ... e ho usato char (7) per il delimitatore anziché la barra verticale quot; | <> quot; nel caso in cui si tratti di un elemento di testo desiderato.
Questo è molto pulito e compatto e funziona bene.
{=RIGHT(A1,LEN(A1)-MAX(IF(MID(A1,ROW(1:999),1)=" ",ROW(1:999),0)))}
Non intercetta errori per nessuno spazio o una parola, ma è facile da aggiungere.
Modifica
Gestisce gli spazi finali, le parole singole e gli scenari di celle vuote. Non ho trovato il modo di romperlo.
{=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," ","")))))
Per aggiungere alle risposte di Jerry e Joe, se vuoi trovare il testo PRIMA dell'ultima parola che puoi usare:
=TRIM(LEFT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))))-LEN(TRIM(A1))))
Con "Il mio piccolo gatto" in A1 si tradurrebbe in "Il mio piccolo" (dove Joe e Jerry's darebbero "gatto"
Allo stesso modo in cui Jerry e Joe isolano l'ultima parola, questa quindi riporta tutto alla sinistra (quindi la ritaglia indietro)
Immagina che la stringa possa essere invertita. Quindi è davvero facile. Invece di lavorare sulla stringa:
"My little cat" (1)
lavori con
"tac elttil yM" (2)
Con =LEFT(A1;FIND(" ";A1)-1)
in A2 ottieni "My"
con (1) e "tac"
con (2), che è invertito "cat"
, l'ultima parola in (1).
Ci sono alcuni VBA in giro per invertire una stringa. Preferisco la funzione VBA pubblica ReverseString
.
Installa quanto sopra come descritto. Quindi con la stringa in A1, ad es. "My little cat"
e questa funzione in A2:
=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1));
LEN(A1);(FIND(" ";ReverseString(A1))-1))))
vedrai IF
in A2.
Il metodo sopra presuppone che le parole siano separate da spazi. La clausola TRIM
è per le celle che contengono singole parole = nessun vuoto nella cella. Nota: CLEAN
e "tac "
anche la stringa originale sono utili. In linea di principio inverte l'intera stringa di A1 e trova semplicemente il primo spazio vuoto nella stringa invertita che si trova accanto all'ultima parola (invertita) (cioè LEFT
). " cat"
seleziona questa parola e un'altra inversione di stringa ricostituisce l'ordine originale della parola (-1
). La FIND
alla fine dell'istruzione RIGHT
rimuove lo spazio vuoto.
L'idea è che è facile estrarre la prima (!) parola in una stringa con <=> e <=> inserendo il primo spazio vuoto. Tuttavia, per l'ultima parola (!) La funzione <=> è la scelta sbagliata quando si tenta di farlo perché purtroppo FIND non ha un flag per la direzione in cui si desidera analizzare la stringa.
Pertanto l'intera stringa viene semplicemente invertita. <=> e <=> funzionano normalmente ma la stringa estratta è invertita. Ma il suo non è un grosso problema una volta che sai come invertire una stringa. La prima <=> istruzione nella formula fa questo lavoro.
=LEFT(A1,FIND(IF(
ISERROR(
FIND("_",A1)
),A1,RIGHT(A1,
LEN(A1)-FIND("~",
SUBSTITUTE(A1,"_","~",
LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
)
)
)
),A1,1)-2)
Ho tradotto in PT-BR, poiché ne avevo bisogno anche io.
(Nota che ho cambiato lo spazio in \
perché avevo bisogno solo del nome file delle stringhe di percorso.)
=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))
Un altro modo per raggiungere questo obiettivo è il seguente
=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)))))
Avevo anche un compito come questo e quando ho finito, usando il metodo sopra, mi è venuto in mente un nuovo metodo: Perché non lo fai:
- Inverti la stringa (" stringa una " diventa " eno gnirts ").
- Usa il buon vecchio Find (che è hardcoded per sinistra-destra).
- Invertire di nuovo in stringa leggibile.
Come suona?