excel - seleccionar - para crear selecciones de celdas no continuas debemos
¿Cómo puedo realizar una búsqueda de cadenas inversas en Excel sin usar VBA? (14)
Tengo una hoja de cálculo de Excel que contiene una lista de cadenas. Cada cadena está formada por varias palabras, pero el número de palabras en cada cadena es diferente.
Al utilizar las funciones integradas de Excel (sin VBA), ¿hay alguna forma de aislar la última palabra en cada cadena?
Ejemplos:
Are you classified as human? -> human? Negative, I am a meat popsicle -> popsicle Aziz! Light! -> Light!
Encontré this en Google, probado en Excel 2003 y funciona para mí:
=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)
[edit] No tengo suficientes representantes para comentar, así que este parece ser el mejor lugar ... La respuesta de BradC tampoco funciona con espacios finales o celdas vacías ...
[2nd edit] en realidad, tampoco funciona para palabras sueltas ...
Esta es la técnica que he utilizado con gran éxito:
=TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))
Para obtener la primera palabra de una cadena, simplemente cambie de DERECHA a IZQUIERDA
=TRIM(LEFT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))
Además, reemplace A1 por la celda que contiene el texto.
Este es probado y funciona (basado en la publicación original de Brad):
=RIGHT(A1,LEN(A1)-FIND("|",SUBSTITUTE(A1," ","|",
LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))
Si sus cadenas originales podrían contener una tubería "|" personaje, luego reemplace ambos en el cuadro anterior con otro personaje que no aparecerá en su fuente. (Sospecho que el original de Brad estaba roto porque se eliminó un carácter no imprimible en la traducción).
Bonificación: cómo funciona (de derecha a izquierda):
LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
- Cuenta de espacios en la cadena original
SUBSTITUTE(A1," ","|", ... )
- Reemplaza solo el espacio final con a |
FIND("|", ... )
- Encuentra la posición absoluta de ese reemplazado |
(ese fue el espacio final)
Right(A1,LEN(A1) - ... ))
- Devuelve todos los caracteres después de eso |
EDITAR: para dar cuenta del caso en el que el texto fuente no contiene espacios, agregue lo siguiente al comienzo de la fórmula:
=IF(ISERROR(FIND(" ",A1)),A1, ... )
haciendo la fórmula completa ahora:
=IF(ISERROR(FIND(" ",A1)),A1, RIGHT(A1,LEN(A1) - FIND("|",
SUBSTITUTE(A1," ","|",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))))
O puede usar la sintaxis =IF(COUNTIF(A1,"* *")
de la otra versión.
Cuando la cadena original pueda contener un espacio en la última posición, agregue una función de recorte mientras cuente todos los espacios: Realice la función de la siguiente manera:
=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))
Esto es muy limpio y compacto, y funciona bien.
{=RIGHT(A1,LEN(A1)-MAX(IF(MID(A1,ROW(1:999),1)=" ",ROW(1:999),0)))}
No hace trampa de errores sin espacios o una palabra, pero eso es fácil de agregar.
Editar:
Esto maneja espacios finales, una sola palabra y escenarios de celdas vacías. No he encontrado una manera de romperlo.
{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}
Imagina que la cuerda podría invertirse. Entonces es realmente fácil. En lugar de trabajar en la cadena:
"My little cat" (1)
usted trabaja con
"tac elttil yM" (2)
Con =LEFT(A1;FIND(" ";A1)-1)
en A2 obtienes "My"
con (1) y "tac"
con (2), que se invierte "cat"
, la última palabra en (1) .
Hay algunos VBA alrededor para invertir una cadena. Prefiero la función VBA pública ReverseString
.
Instale lo anterior como se describe. Luego, con su cadena en A1, por ejemplo, "My little cat"
y esta función en A2:
=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1));
LEN(A1);(FIND(" ";ReverseString(A1))-1))))
verás "cat"
en A2.
El método anterior supone que las palabras están separadas por espacios en blanco. La cláusula IF
es para celdas que contienen palabras sueltas = sin espacios en blanco en la celda. Nota: TRIM
y CLEAN
la cadena original también son útiles. En principio, invierte toda la cadena desde A1 y simplemente encuentra el primer espacio en blanco en la secuencia invertida que está junto a la última palabra (invertida) (es decir, "tac "
). LEFT
elige esta palabra y otra inversión de cadena reconstituye el orden original de la palabra ( " cat"
). El -1
al final de la instrucción FIND
elimina el espacio en blanco.
La idea es que es fácil extraer la primera palabra (!) En una cadena con LEFT
y FIND
el primer espacio en blanco. Sin embargo, para la última palabra (!), La función RIGHT
es la opción incorrecta cuando intenta hacer eso porque, lamentablemente, FIND no tiene un indicador para la dirección en la que desea analizar su cadena.
Por lo tanto, toda la cadena simplemente se invierte. LEFT
y FIND
funcionan normalmente, pero la secuencia extraída se invierte. Pero el suyo no es gran cosa una vez que sabes cómo invertir una cuerda. La primera instrucción ReverseString
en la fórmula hace este trabajo.
Otra forma de lograr esto es como a continuación
=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)))))
Para agregar a las respuestas de Jerry y Joe, si quiere encontrar el texto ANTES de la última palabra, puede usar:
=TRIM(LEFT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))))-LEN(TRIM(A1))))
Con ''Mi pequeño gato'' en A1 resultaría en ''Mi pequeño'' (donde Joe y Jerry darían ''gato''
De la misma manera en que Jerry y Joe aíslan la última palabra, esto hace que todo quede a la izquierda de eso (luego se recorta)
También tuve una tarea como esta y cuando terminé, usando el método anterior, se me ocurrió un nuevo método: ¿por qué no haces esto?
- Invierta la cuerda ("string one" se convierte en "eno gnirts").
- Utilice el buen viejo Find (que está codificado de izquierda a derecha).
- Invierta nuevamente en cadena legible.
¿Como suena esto?
Traducí a PT-BR, ya que también necesitaba esto.
(Tenga en cuenta que he cambiado el espacio a /
porque necesitaba el nombre de archivo solo de las cadenas de ruta).
=SE(ÉERRO(PROCURAR("/",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"/","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"/",""))))))
Una versión más robusta de la respuesta de Jerry:
=TRIM(RIGHT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))
Eso funciona independientemente de la longitud de la cuerda, los espacios iniciales o finales, o cualquier otra cosa, y todavía es bastante corto y simple.
=LEFT(A1,FIND(IF(
ISERROR(
FIND("_",A1)
),A1,RIGHT(A1,
LEN(A1)-FIND("~",
SUBSTITUTE(A1,"_","~",
LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
)
)
)
),A1,1)-2)
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))
=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)
Esto es muy robusto: funciona para oraciones sin espacios, espacios iniciales / finales, espacios múltiples, múltiples espacios iniciales / finales ... y usé char (7) para el delimitador en lugar de la barra vertical "|" solo en caso de que sea un elemento de texto deseado.