Excel: ultimo carattere / stringa corrisponde in una stringa

Esiste un modo efficace per identificare l’ultimo carattere / stringa in una stringa utilizzando le funzioni di base? Cioè l’ultimo carattere / stringa della stringa, ma la posizione dell’ultima ricorrenza di un carattere / stringa in una stringa. Search e find entrambi i lavori da sinistra a destra, quindi non riesco a pensare a come applicare senza un lungo algoritmo ricorsivo. E questa soluzione ora sembra obsoleta.

Penso di avere ciò che intendi. Diciamo, ad esempio, che vuoi il più destro \ nella stringa seguente (che è memorizzata nella cella A1):

Drive: \ Folder \ SubFolder \ Nomefile.est

Per ottenere la posizione dell’ultimo \, dovresti usare questa formula:

 =FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\"))) 

Questo ci dice che la cosa più giusta è al carattere 24. Lo fa cercando “@” e sostituendo l’ultima “\” con una “@”. Determina l’ultimo usando

 (len(string)-len(substitute(string, substring, "")))\len(substring) 

In questo scenario, la sottostringa è semplicemente “\” che ha una lunghezza di 1, quindi puoi lasciare la divisione alla fine e usare semplicemente:

 =FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))) 

Ora possiamo usarlo per ottenere il percorso della cartella:

 =LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))) 

Ecco il percorso della cartella senza il trailing \

 =LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1) 

E per ottenere solo il nome del file:

 =MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1)) 

Tuttavia, qui è una versione alternativa di ottenere tutto alla destra dell’ultima istanza di un carattere specifico. Quindi, usando il nostro stesso esempio, questo restituirebbe anche il nome del file:

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

Che ne dici di creare una funzione personalizzata e usarla nella tua formula? VBA ha una funzione InStrRev , InStrRev , che fa esattamente quello che stai cercando.

Metti questo in un nuovo modulo:

 Function RSearch(str As String, find As String) RSearch = InStrRev(str, find) End Function 

E la tua funzione sarà simile a questa (assumendo che la stringa originale sia in B1):

 =LEFT(B1,RSearch(B1,"\")) 

tigeravatar e Jean-François Corbett hanno suggerito di usare questa formula per generare la stringa giusta dell’ultima occorrenza del carattere “\”

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

Se il carattere utilizzato come separatore è spazio, “”, la formula deve essere modificata in:

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

Non c’è bisogno di menzionare, il carattere “{” può essere sostituito con qualsiasi carattere che non si verificherebbe “normalmente” nel testo da elaborare.

È ansible utilizzare questa funzione che ho creato per trovare l’ultima istanza di una stringa all’interno di una stringa.

Certo, la formula Excel accettata funziona, ma è troppo difficile da leggere e utilizzare. Ad un certo punto devi dividere in pezzi più piccoli in modo che sia mantenibile. La mia funzione in basso è leggibile, ma è irrilevante perché la chiami in una formula usando parametri con nome. Questo rende semplice l’uso.

 Public Function FindLastCharOccurence(fromText As String, searchChar As String) As Integer Dim lastOccur As Integer lastOccur = -1 Dim i As Integer i = 0 For i = Len(fromText) To 1 Step -1 If Mid(fromText, i, 1) = searchChar Then lastOccur = i Exit For End If Next i FindLastCharOccurence = lastOccur End Function 

Lo uso in questo modo:

 =RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\")) 

Ho appena trovato questa soluzione, nessun VBA necessario;

Trova l’ultima occorrenza di “_” nel mio esempio;

 =IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0) 

Spiegato dentro e fuori

 SUBSTITUTE(A1;"_";"") => replace "_" by spaces LEN( *above* ) => count the chars LEN(A1)- *above* => indicates amount of chars replaced (= occurrences of "_") SUBSTITUTE(A1;"_";CHAR(1); *above* ) => replace the Nth occurence of "_" by CHAR(1) (Nth = amount of chars replaced = the last one) FIND(CHAR(1); *above* ) => Find the CHAR(1), being the last (replaced) occurance of "_" in our case IFERROR( *above* ;"0") => in case no chars were found, return "0" 

Spero che questo sia stato utile.

Sono un po ‘in ritardo per la festa, ma forse questo potrebbe aiutare. Il link nella domanda aveva una formula simile, ma la mia usa l’istruzione IF () per sbarazzarsi degli errori.

Se non hai paura di Ctrl + Shift + Invio, puoi fare abbastanza bene con una formula di array.

String (nella cella A1): “one.two.three.four”

Formula:

 {=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))} use Ctrl+Shift+Enter 

Risultato: 14

Primo,

 ROW($1:$99) 

restituisce un array di numeri interi da 1 a 99: {1,2,3,4,...,98,99} .

Il prossimo,

 MID(A1,ROW($1:$99),1) 

restituisce un array di stringhe di 1 lunghezza trovate nella stringa di destinazione, quindi restituisce stringhe vuote dopo aver raggiunto la lunghezza della stringa di destinazione: {"o","n","e",".",..."u","r","","",""...}

Il prossimo,

 IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)) 

confronta ogni elemento dell’array con la stringa “.” e restituisce l’indice del carattere nella stringa o FALSE: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}

Ultimo,

 =MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))) 

restituisce il valore massimo dell’array: 14

I vantaggi di questa formula sono che è breve, relativamente facile da capire e non richiede caratteri univoci.

Gli svantaggi sono l’uso obbligatorio di Ctrl + Maiusc + Invio e la limitazione sulla lunghezza della stringa. Questo può essere risolto con una variazione mostrata di seguito, ma tale variazione utilizza la funzione OFFSET () che è una funzione volatile (leggi: lenta).

Non sei sicuro di quale sia la velocità di questa formula rispetto agli altri.

variazioni:

 =MAX((MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)=".")*ROW(OFFSET($A$1,,,LEN(A1)))) works the same way, but you don't have to worry about the length of the string =SMALL(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd occurrence of the match =LARGE(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd-to-last occurrence of the match =MAX(IF(MID(I16,ROW($1:$99),2)=".t",ROW($1:$99))) matches a 2-character string **Make sure you change the last argument of the MID() function to the number of characters in the string you wish to match! 

Considerando una parte di un commento fatta da @SSilk il mio objective finale è stato davvero quello di ottenere tutto a destra di quell’ultima occorrenza un approccio alternativo con una formula molto semplice è copiare una colonna (ad esempio A ) di stringhe e sulla copia ( dì Colonna B) applica Trova e Sostituisci. Ad esempio prendendo l’esempio: Drive:\Folder\SubFolder\Filename.ext

Trovare cosa

Ciò restituisce ciò che rimane (qui Filename.ext ) dopo l’ultima istanza di qualunque carattere viene scelto (qui \ ), che a volte è comunque l’objective e facilita la ricerca della posizione dell’ultimo carattere con una formula breve come:

 =FIND(B1,A1)-1 

Un modo semplice per farlo in VBA è:

 YourText = "c:\excel\text.txt" xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" )) 

Molto tardi alla festa, ma una soluzione semplice sta usando VBA per creare una funzione personalizzata.

Aggiungere la funzione a VBA in WorkBook, Foglio di lavoro o Modulo VBA

 Function LastSegment(S, C) LastSegment = Right(S, Len(S) - InStrRev(S, C)) End Function 

Quindi la formula cellulare

 =lastsegment(B1,"/") 

in una cella e la stringa da cercare nella cella B1 popolerà la cella con il testo che trascina l’ultimo “/” dalla cella B1. Nessun limite di lunghezza, nessuna formula oscura. L’unico lato negativo che posso pensare è la necessità di una cartella di lavoro con funzionalità macro.

Qualsiasi funzione VBA utente può essere chiamata in questo modo per restituire un valore a una formula di cella, incluso come parametro per una funzione di Excel incorporata.

Se hai intenzione di utilizzare la funzione pesantemente, ti consigliamo di verificare la presenza del caso quando il carattere non è nella stringa, quindi la stringa è vuota, ecc.