Come posso eseguire una ricerca di stringhe inverse in Excel senza usare VBA?


165

Ho un foglio di calcolo Excel contenente un elenco di stringhe. Ogni stringa è composta da più parole, ma il numero di parole in ogni stringa è diverso.

Utilizzando le funzioni di Excel integrate (senza VBA), c'è un modo per isolare l'ultima parola in ogni stringa?

Esempi:

  Sei classificato come umano? -> umano?
Negativo, sono un ghiacciolo di carne -> ghiacciolo
                  Aziz! Luce! -> Luce!

4
Mi chiedo perché non hai il vincolo artificiale VBA?
EBGreen

3
Posso facilmente risolverlo con VBA, ma sono curioso di sapere se esiste una soluzione non VBA. VBA tende a penalizzare le prestazioni per insiemi di dati di grandi dimensioni.
e.James

Come al solito, spiccano due risposte, e faccio fatica a decidere quale scegliere come risposta corretta. In questo caso, sia Jon che BradC (con l'aiuto di Brad) hanno escogitato soluzioni corrette e funzionanti.
e.James

Ho scelto la soluzione di BradC perché sembra essere la più elegante delle due e fornisce una comoda spiegazione della funzione.
e.James

È difficile rispondere correttamente alla tua domanda se non indichi ciò che rende VBA inappropriato (poiché puoi scrivere le tue macro e le tue funzioni in VBA, rendendolo equivalente alle funzioni integrate).
dkretz,

Risposte:


208

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é un personaggio non stampabile è stato rimosso nella traduzione).

Bonus: come funziona (da destra a sinistra):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- Conteggio degli spazi nella stringa originale
SUBSTITUTE(A1," ","|", ... )- Sostituisce solo lo spazio finale con a |
FIND("|", ... )- Trova la posizione assoluta di quella sostituita |(che era lo spazio finale)
Right(A1,LEN(A1) - ... ))- Restituisce tutti i caratteri dopo|

MODIFICA: per tenere conto del caso in cui il testo di origine non contiene spazi, aggiungere 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 usare la =IF(COUNTIF(A1,"* *")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," ",""))))))

1
Non posso ringraziarti abbastanza. Necessario anche il resto della stringa, quindi semplicemente cambiando = RIGHT in = LEFT e rimuovendo LEN (A1) - mi ha permesso di ottenere il resto. Ma grazie per aver svolto tutto il lavoro iniziale per le gambe :)
Luke Duddridge,

4
+1: Dovrò ricordare il trucco "LEN (A1) -LEN (SOSTITUTIVO (A1," "," "))" per ottenere il numero di istanze di un personaggio
risposta il

2
Ottima soluzione! L'unico problema è che Excel localizza i nomi delle funzioni, quindi è necessario riscrivere la formula per Excel non inglese. Ecco la variante riscritta per quella russa: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "|"; ДЛСТР (A1) -ДЛСТР (ПОДСТАВИЬ; A1; ""; "")))))
Michael Pliskin,

Questa risposta si interrompe su stringhe contenenti spazi consecutivi.
Qualche cosa è

1
Consiglierei di suddividere le formule in colonne temporanee (puoi nasconderle in seguito). È molto utile per il debug di casi speciali.
Wisbucky

84

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.


2
Funziona per me - ho appena sostituito il primo " "con il mio delimitatore. I due 100sembrano limitarlo a una stringa di 100 caratteri se non sbaglio
Benjineer,

1
Se utilizziamo un delimitatore diverso, dobbiamo eliminarlo anche alla fine, ad esempio=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
silente

7
Metodo molto intelligente. Ciò che fa è sostituire ogni spazio con 100 spazi, quindi restituire gli ultimi 100 caratteri senza spazi iniziali / finali.
Zenadix,

@Benjineer Penso che funzioni per stringhe molto più lunghe di 100 caratteri. I 100 caratteri limitano la dimensione di una singola parola. Stai prendendo il giusto (o sinistro) cento caratteri ..... se una parola di 101 caratteri lunga avresti un problema, ma se una stringa complessiva di 100 caratteri ... con 3 spazi ... sarebbe imbottito con una stringa di circa 400 caratteri e funziona ancora. A Jerry Beaucaire - Molto elegante, grazie.
Tin Bum,

22

Una versione più solida della risposta di Jerry:

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

Funziona indipendentemente dalla lunghezza della stringa, dagli spazi iniziali o finali o da qualsiasi altra cosa ed è ancora piuttosto breve e semplice.


2
È una formula eccellente. Ho modificato la formula =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))per ottenere l'estensione del file.
Adarsh ​​Madrecha,

2
Uno in più gli SUBSTITUTEpermette di funzionare per qualsiasi personaggio, non solo per gli spazi. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), dove "/" è il carattere delimitante.
PProteo,

@Joefinkle, questa è una soluzione davvero concisa e intelligente. Funziona abbastanza bene, solo per citare che se il delimitatore è una stringa che non funziona bene in tutti i casi, qui un esempio per un delimitatore: " ; "(un punto e virgola circondata da spazi) con valore di ingresso: "Technology Sprint 24 ; Sprint 4"restituisce: "; Sprint 4". Sto usando la soluzione aggiunta da: @PProteus.
David Leal,

Se il delimitatore è una stringa, una possibile soluzione alternativa potrebbe essere quella di sostituirlo prima con un carattere speciale, ad esempio sostituendo la formula @PProteus TRIM(A1)con: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))in tutti i punti, al fine di avere un nuovo delimitatore di caratteri: ";"o meglio usare la char()funzione per trovare un personaggio davvero inaspettato.
David Leal,

1
@PProteus non è necessaria la TRIMfunzione dopo aver aggiunto il secondo SUBSTITUTEper la soluzione a carattere singolo del caso generale. La formula fornisce il risultato atteso eliminando questa parte:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal,

13

Ho trovato questo su Google, testato in Excel 2003 e 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 per singole parole o ...


La soluzione più vicina ancora, ma aggiungerei un Trim () poiché uno spazio finale lo romperà.
EBGreen

Vero, probabilmente il più semplice da tagliare () in una cella intermedia e quindi applicare la formula sopra alla cella intermedia. Inoltre, sputa 0 se la cella risulta vuota, quindi potrebbe anche essere racchiusa con 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)

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 "|" nel caso in cui si tratti di un elemento di testo desiderato.


Funziona per me in Excel 2010. Grazie
Rudiger Wolf,

2

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 spazi finali, parole singole e 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)))}

Freddo. Questo è un uso davvero interessante delle funzioni dell'array! Non mi aspettavo di ricevere un'altra risposta dopo tanto tempo. Grazie per aver condiviso.
e.James

2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 

L'hai provato? Non funziona per me con "Sei classificato come umano?"
Ed Guiness,

No, non funziona Ha alcuni elementi interessanti, però. LEN (A1) -LEN (SUBSTITUTE (A1, "", "") fornisce il conteggio degli spazi nella stringa.
BradC

Questa è una funzione interessante. Peccato che non funzioni. Mi piace il trucco per poter contare il numero di spazi.
e.James,

@Brad: ho modificato il tuo post per mostrare i * caratteri. L'originale non li ha stampati correttamente. Con questi in atto, funziona. +1
e.James

2

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 "My little cat" in A1 si tradurrebbe in "My little" (dove Joe e Jerry's darebbero "cat"

Allo stesso modo in cui Jerry e Joe isolano l'ultima parola, questa poi riporta tutto a sinistra (poi la ritaglia)


1

Immagina che la stringa possa essere invertita. Quindi è davvero facile. Invece di lavorare sulla stringa:

"My little cat" (1)

con cui lavori

"tac elttil yM" (2)

Con =LEFT(A1;FIND(" ";A1)-1)in A2 ottieni "My"con (1) e "tac"con (2), che è invertita "cat", l'ultima parola in (1).

Ci sono alcuni VBA in giro per invertire una stringa. Preferisco la funzione VBA pubblica ReverseString.

Installare quanto sopra come descritto. Quindi con la tua stringa in A1, ad esempio, "My little cat"e questa funzione in A2:

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

vedrai "cat"in A2.

Il metodo sopra presuppone che le parole siano separate da spazi. La IFclausola è per le celle che contengono singole parole = nessun vuoto nella cella. Nota: TRIMe anche CLEANla 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è, "tac "). LEFTseleziona questa parola e un'altra inversione di stringa ricostituisce l'ordine originale della parola ( " cat"). Il -1alla fine FINDdell'istruzione rimuove lo spazio vuoto.

L'idea è che è facile estrarre la prima (!) Parola in una stringa con LEFTe FINDing il primo spazio vuoto. Tuttavia, per l'ultima parola (!) La RIGHTfunzione è 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. LEFTe FINDfunziona normalmente ma la stringa estratta è invertita. Ma il suo non è un grosso problema una volta che sai come invertire una stringa. La prima ReverseStringaffermazione nella formula fa questo lavoro.


È molto più semplice di tutte le altre opzioni qui, grazie mille !! Perché Find non può avere una ricerca inversa o un sostituto - Mi sembra di ricordare qualcosa a che fare con l'uso di un numero negativo per fare la ricerca inversa, ma chiaramente non vba ....
Craig Lambie,

3
L'OP non ha richiesto VBA.
Tripp Kinetics,

Anche questo è pazzo! Se hai intenzione di usare VBA, potresti altrettanto facilmente trovare un contrario
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)

1

Copia in una colonna, seleziona quella colonna e HOME> Modifica> Trova e seleziona, Sostituisci:

Trovare cosa:

Replace All.

C'è uno spazio dopo l'asterisco.


Nota che * è un jolly (avido) nelle ricerche di Excel, quindi questo corrisponde a tutto fino all'ultimo spazio e lo sostituisce con nulla
Superfly Jon

0

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,"\",""))))))

3
Non so leggere Excel in portoghese, quindi dovrò
crederci

0

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

inserisci qui la descrizione dell'immagine


-1

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:

  1. Invertire la stringa ("stringa una" diventa "eno gnirts").
  2. Usa il buon vecchio Find (che è hardcoded da sinistra a destra).
  3. Invertire di nuovo in stringa leggibile.

Come suona?


12
Sicuro. Ma come si inverte la stringa in Excel?
e.James,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.