¿Hay una manera eficiente de identificar la última coincidencia de caracteres / cadenas en una cadena utilizando funciones base? Es decir, no 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 funcionan de izquierda a derecha, así que no puedo pensar cómo aplicar sin un largo algoritmo recursivo. Y esta solución ahora parece obsoleta.
excel-formula
geoteoria
fuente
fuente
search
yfind
tanto el contenido de la cadena de consulta , 'coincidencia' es un término estándar, más el ejemplo vinculado.Respuestas:
Con las versiones más nuevas de Excel vienen nuevas funciones y, por lo tanto, nuevos métodos. Aunque es replicable en versiones anteriores (aún no lo he visto antes), cuando uno tiene Excel O365 se puede usar:
Esto también se puede utilizar para recuperar la última posición de las subcadenas (superpuestas):
Si bien esto nos permite dejar de usar un carácter de reemplazo arbitrario y permite patrones superpuestos, el "inconveniente" es el uso de una matriz.
Nota: Puede forzar el mismo comportamiento en versiones anteriores de Excel a través de cualquiera
Ingresado a través de CtrlShiftEnter, o usando una línea
INDEX
para deshacerse de la intersección implícita:fuente
Creo que entiendo lo que quieres decir. Digamos, por ejemplo, que desea el extremo derecho \ en la siguiente cadena (que se almacena en la celda A1):
Unidad: \ Carpeta \ Subcarpeta \ Nombre de archivo.ext
Para obtener la posición de la última \, usaría esta fórmula:
Eso nos dice que la más a la derecha está en el carácter 24. Lo hace buscando "@" y sustituyendo la última "\" con una "@". Determina el último usando
En este escenario, la subcadena es simplemente "\" que tiene una longitud de 1, por lo que puede dejar la división al final y simplemente usar:
Ahora podemos usar eso para obtener la ruta de la carpeta:
Aquí está la ruta de la carpeta sin el final \
Y para obtener solo el nombre del archivo:
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:
fuente
SUBSTITUTE
todas (3) instancias\
sin nada (acortar la longitud de la cadena por 3) -> que\
(el 3er) es el último; reemplace eso con algo único yFIND
la posición de ese personaje único ... increíble ... ¡gracias!=ISNUMBER(SEARCH("@",A1))
, según lo propuesto por @ gwin003 .99
? ¿Estás asumiendo que la longitud de estas diferentes cadenas es menor que 99? Vea esta respuesta y esta respuesta que no hacen tal suposición.¿Qué tal crear una función personalizada y usarla 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:
Y su función se verá así (suponiendo que la cadena original esté en B1):
fuente
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 "\"
Si el carácter utilizado como separador es espacio, "", entonces la fórmula debe cambiarse a:
No es necesario mencionar que el carácter "{" se puede reemplazar con cualquier carácter que no se produzca "normalmente" en el texto a procesar.
fuente
Se me ocurrió esta solución, no se necesita VBA;
Encuentre la última aparición de "_" en mi ejemplo;
Explicado de adentro hacia afuera;
Espero que esto haya sido útil.
fuente
Podrías usar esta función que creé para encontrar la última instancia de una cadena dentro de una cadena.
Claro que la fórmula de Excel aceptada funciona, pero es demasiado difícil de leer y usar. En algún momento, debe dividirse en trozos más pequeños para que sea mantenible. Mi función a continuación es legible, pero eso es irrelevante porque lo llamas en una fórmula que usa parámetros con nombre. Esto hace que usarlo sea simple.
Lo uso así:
fuente
Teniendo en cuenta una parte de un comentario hecho por @SSilk, mi objetivo final ha sido realmente poner todo a la derecha de esa última ocurrencia. Un enfoque alternativo con una fórmula muy simple es copiar una columna (digamos
A
) de cadenas y en la copia (digamos ColumnaB) aplique 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 personaje elegido (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:fuente
Llego un poco tarde a la fiesta, pero tal vez esto pueda 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 tienes miedo de Ctrl + Shift + Enter, puedes hacerlo bastante bien con una fórmula de matriz.
Cadena (en la celda A1): "one.two.three.four"
Fórmula:
Resultado: 14
Primero,
devuelve una matriz de enteros de 1 a 99:
{1,2,3,4,...,98,99}
.Próximo,
devuelve una matriz de cadenas de 1 longitud encontradas en la cadena de destino, luego devuelve cadenas en blanco después de alcanzar la longitud de la cadena de destino:
{"o","n","e",".",..."u","r","","",""...}
Próximo,
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,
devuelve el valor máximo de la matriz:
14
La ventaja de esta fórmula es que es corta, relativamente fácil de entender y no requiere caracteres únicos.
Las desventajas son el uso requerido de Ctrl + Shift + Enter y la limitación en la longitud de la cadena. Esto se puede solucionar con una variación que se muestra a continuación, pero esa variación utiliza la función OFFSET (), que es una función volátil (lectura: lenta).
No estoy seguro de cuál es la velocidad de esta fórmula frente a otras.
Variaciones:
fuente
En las versiones más recientes de Excel (2013 y posteriores), el relleno flash puede ser una solución simple y rápida; consulte: Uso de Flash Fill en Excel .
fuente
Una forma simple de hacerlo en VBA es:
fuente
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 Libro de trabajo, Hoja de trabajo o un Módulo VBA
Entonces la fórmula celular
en una celda y la cadena que se buscará en la celda B1 llenará la celda con el texto detrás de la última "/" de la celda B1. Sin límite de longitud, sin fórmulas oscuras. El único inconveniente que puedo pensar es la necesidad de un libro de trabajo habilitado para macros.
Se puede llamar a cualquier función VBA de usuario de esta manera para devolver un valor a una fórmula de celda, incluso como parámetro a una función incorporada de Excel.
Si va a utilizar mucho la función, querrá verificar el caso en que el carácter no está en la cadena, entonces la cadena está en blanco, etc.
fuente
Célula
A1 = find/the/position/of/the last slash
Una forma simple de hacerlo es invertir el texto y luego encontrar la primera barra como de costumbre. Ahora puede obtener la longitud del texto completo menos este número.
Al igual que:
=LEN(A1)-FIND("/",REVERSETEXT(A1),1)+1
Esto devuelve 21, la posición del último /
fuente
REVERSETEXT
no es una fórmula estándar de Excel