una texto partir palabra numeros izquierda funcion extraer entre encontrar eliminar después derecha cómo contiene como celda caracteres caracter buscar antes excel-formula

excel formula - texto - Excel: el último carácter/coincidencia de cadena en una cadena



excel extraer texto entre dos caracteres (9)

¿Qué tal crear una función personalizada y usar eso en tu fórmula? VBA tiene una función incorporada, InStrRev , que hace exactamente lo que estás buscando.

Pon esto en un nuevo módulo:

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

Y su función se verá así (suponiendo que la cadena original esté en B1):

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

¿Hay una forma eficiente de identificar el último carácter / coincidencia de cadena en una cadena que utiliza funciones base? Es decir, no es el último carácter / cadena de la cadena, sino la posición de la última aparición de un carácter / cadena en una cadena. Search y find ambos trabajos de izquierda a derecha, así que no puedo pensar en cómo aplicarlos sin un algoritmo recursivo largo. Y esta solución ahora parece obsoleta.


Considerando una parte de un comentario hecho por @SSilk mi meta final ha sido realmente lograr todo a la derecha de esa última ocurrencia. Un enfoque alternativo con una fórmula muy simple es copiar una columna (decir A ) de cadenas y en la copia ( di ColumnB) aplicar Buscar y Reemplazar. Por ejemplo, tomando el ejemplo: Drive:/Folder/SubFolder/Filename.ext

Esto devuelve lo que queda (aquí Filename.ext ) después de la última instancia de cualquier carácter que se elija (aquí / ) que a veces es el objetivo de todos modos y facilita encontrar la posición del último personaje con una fórmula corta como:

=FIND(B1,A1)-1


Creo que entiendo lo que quieres decir. Digamos, por ejemplo, que desea el más a la derecha en la siguiente cadena (que está almacenada en la celda A1):

Unidad: / Folder / SubFolder / Filename.ext

Para obtener la posición de la última /, usaría esta fórmula:

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

Eso nos dice que el más correcto / está en el carácter 24. Lo hace buscando "@" y sustituyendo el último "/" con un "@". Determina el último usando

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

En este escenario, la subcadena es simplemente "/" que tiene una longitud de 1, por lo que podría dejar la división al final y solo usar:

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

Ahora podemos usar eso para obtener la ruta de la carpeta:

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

Aquí está la ruta de la carpeta sin el final /

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

Y para obtener solo el nombre del archivo:

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

Sin embargo, aquí hay una versión alternativa de obtener todo a la derecha de la última instancia de un personaje específico. Entonces, usando nuestro mismo ejemplo, esto también devolvería el nombre del archivo:

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


Llego un poco tarde a la fiesta, pero quizás esto podría ayudar. El enlace en la pregunta tenía una fórmula similar, pero la mía usa la declaración IF () para deshacerse de los errores.

Si no le teme a Ctrl + Shift + Enter, puede hacerlo bastante bien con una fórmula de matriz.

Cadena (en la celda A1): "one.two.three.four"

Fórmula:

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

Resultado: 14

Primero,

ROW($1:$99)

devuelve una matriz de enteros de 1 a 99: {1,2,3,4,...,98,99} .

Siguiente,

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

devuelve una matriz de cadenas de 1 longitud encontradas en la cadena objetivo, y luego devuelve cadenas en blanco una vez que se alcanza la longitud de la cadena objetivo: {"o","n","e",".",..."u","r","","",""...}

Siguiente,

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

compara cada elemento de la matriz con la cadena "." y devuelve el índice del carácter en la cadena o FALSO: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}

Último,

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

devuelve el valor máximo de la matriz: 14

Las ventajas de esta fórmula es que es corta, relativamente fácil de entender y no requiere ningún carácter único.

Las desventajas son el uso requerido de Ctrl + Shift + Enter y la limitación en la longitud de la cuerda. Esto se puede solucionar con una variación que se muestra a continuación, pero esa variación usa la función OFFSET (), que es una función volátil (leer: lenta).

No estoy seguro de cuál es la velocidad de esta fórmula frente a otras.

Variaciones:

=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!


Muy tarde para la fiesta, pero Una solución simple es usar VBA para crear una función personalizada.

Agregue la función a VBA en el WorkBook, la Hoja de trabajo o un Módulo de VBA

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

Entonces la fórmula celular

=lastsegment(B1,"/")

en una celda y la cadena a ser buscada en la celda B1 rellenará la celda con el texto detrás de la última "/" de la celda B1. Sin límite de duración, sin fórmulas oscuras. El único inconveniente que puedo pensar es la necesidad de un libro de trabajo macro habilitado.

Cualquier función de usuario VBA se puede llamar de esta manera para devolver un valor a una fórmula de celda, incluyendo como parámetro a una función de Excel incorporada.

Si va a utilizar la función en gran medida, querrá verificar el caso cuando el carácter no esté en la cadena, luego la cadena esté en blanco, etc.


Puede usar esta función que creé para encontrar la última instancia de una cadena dentro de una cadena.

Seguro que la fórmula Excel aceptada funciona, pero es demasiado difícil de leer y usar. En algún momento debes dividir en trozos más pequeños para que pueda mantenerse. Mi función a continuación es legible, pero eso es irrelevante porque lo llamas en una fórmula usando parámetros nombrados. Esto hace que usarlo sea simple.

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 así:

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


Solo se me ocurrió esta solución, no se necesita VBA;

Encuentre la última ocurrencia de "_" en mi ejemplo;

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

Explicado al revés

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"

Espero que esto haya sido útil.


Una forma sencilla de hacerlo en VBA es:

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


tigeravatar y Jean-François Corbett sugirieron usar esta fórmula para generar la cadena a la derecha de la última aparición del carácter "/"

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

Si el carácter utilizado como separador es espacio, "", entonces la fórmula debe cambiarse a:

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

No es necesario mencionar que el carácter "{" puede ser reemplazado por cualquier carácter que no "normalmente" ocurra en el texto a procesar.