2011-05-26 10 views
27

Tengo nombres en una columna. Necesito dividir solo los apellidos de esa columna en otra columna.Extracto de la última subcadena de una celda

El último nombre está delimitado por un espacio del lado derecho.

El contenido en células A2 = Alistair Stevens y entré en la fórmula en la celda B2 (necesito 'Stevens' en la celda B2)

He intentado utilizar las siguientes fórmulas:

=RIGHT(A2,FIND(" ",A2,1)-1) 

=RIGHT(A2,FIND(" ",A2)) 

Ambas estas fórmulas trabajo para esta celda, pero cuando la llevo/copie y pegue para las celdas de abajo, no funciona. ¡Tengo los valores equivocados!

A3 -> David Mckenzie 

B3 -> Mckenzie 
+0

Por favor, publique los contenidos de A3 y el resultante B3 –

Respuesta

42

Esto funciona, incluso cuando hay nombres medios:..

=MID(A2,FIND(CHAR(1),SUBSTITUTE(A2," ",CHAR(1),LEN(A2)-LEN(SUBSTITUTE(A2," ",""))))+1,LEN(A2)) 

Si usted quiere todo, pero el apellido, echa un vistazo a this answer

Si hay espacios finales en los nombres , entonces es posible que desee eliminarlos por r eplacing todas las instancias de A2 por TRIM(A2) en la fórmula anterior.

Tenga en cuenta que es solo por pura casualidad que su primera fórmula =RIGHT(A2,FIND(" ",A2,1)-1) funcione para Alistair Stevens. Esto se debe a que "Alistair" y " Stevens" contienen el mismo número de caracteres (si se cuenta el espacio inicial en " Stevens").

+0

excel master, gracias Jean-Francois !! funciona perfectamente –

+0

¡Esto es asombroso! ¿Qué pasa si el nombre es Sammy L Davis Jr? ¿Cómo hago para ignorar Jr, Sr, III, etc.? – bteague

+0

@bteague ¡Pruébalo! –

-1

DERECHO devuelve el número de caracteres en el segundo parámetro de la derecha del primer parámetro. Entonces, quiere que la longitud total de su columna A reste el índice. que por lo tanto es:

=RIGHT(A2, LEN(A2)-FIND(" ", A2, 1)) 

y usted debe considerar el uso de TRIM (A2) dondequiera que aparezca ...

+1

esto no funciona cuando hay un primer nombre, un segundo nombre y un apellido. Por ejemplo, si hay un 'John Steven Smith', lo que obtengo es 'Steven Smith' –

+0

No dijo que habría segundos nombres ... –

+2

@Jay No lo hizo. Pero pidió "la última subcadena" –

0

Prueba esto:

=RIGHT(TRIM(A2),LEN(TRIM(A2))-FIND(" ",TRIM(A2))) 

yo era capaz de copiar/pegar la fórmula y funcionó bien

Aquí hay una lista de Excel text functions (que funcionó en mayo de 2011, pero está sujeta a fallas la próxima vez que Microsoft cambie su sitio web). :-(

Puede utilizar funciones IF() anidadas en varias etapas para manejar nombres intermedios o iniciales, títulos, etc., si lo espera. Las fórmulas de Excel no admiten el bucle, por lo que hay algunos límites para lo que puede hacer

+1

Al igual que la respuesta de @ Pok, esto no extrae la última subcadena; más bien, elimina la primera subcadena. Esto está bien cuando solo hay un nombre y un apellido, pero no cuando hay uno o varios segundos nombres. –

4

La respuesta proporcionada por @Jean proporciona un trabajo pero la solución oscura (aunque no maneja espacios finales)

Como alternativa considerar una función definida por el usuario VBA (UDF)

Function RightWord(r As Range) As Variant 
    Dim s As String 
    s = Trim(r.Value) 
    RightWord = Mid(s, InStrRev(s, " ") + 1) 
End Function 

Uso en general como
=RightWord(A2)

+7

Obscuro, ¿eh? Llámame cuando Excel permita comentarios en fórmulas. –

+0

@Jean: si, deseo. Eso haría mucho más fácil mantener mi propio código –

0
Right(A1, Len(A1)-Find("(asterisk)",Substitute(A1, "(space)","(asterisk)",Len(A1)-Len(Substitute(A1,"(space)", "(no space)"))))) 

Prueba esto. Espero que funcione.

-1

Prueba esto:

Right(RC[-1],Len(RC[-1])-InStrRev(RC[-1]," ")) 
0

Pruebe esta función en Excel:

Public Shared Function SPLITTEXT(Text As String, SplitAt As String, ReturnZeroBasedIndex As Integer) As String 
     Dim s() As String = Split(Text, SplitAt) 
     If ReturnZeroBasedIndex <= s.Count - 1 Then 
      Return s(ReturnZeroBasedIndex) 
     Else 
      Return "" 
     End If 
    End Function 

que lo utilice como esto:

Nombre (A1) | Apellido (A2)

valor de la celda A1 = Michael Zomparelli

Quiero el último nombre en la columna A2.

=SPLITTEXT(A1, " ", 1) 

El último parámetro es el índice de base cero que desea devolver. Entonces, si divide en el espacio char entonces índice 0 = Michael e índice 1 = Zomparelli

La función anterior es una función .Net, pero se puede convertir fácilmente a VBA.

1

Si desea obtener la segunda a la última palabra en un texto, puede utilizar esta macro como una función de hoja de cálculo:

Public Function Get2ndText(S As String) As String 

Dim sArr() As String 
Dim i As Integer 
sArr = Split(S, " ") 

'get the next to the last string 
i = UBound(sArr) - 1 
Get2ndText = sArr(i) 

End Function 

Luego, en la hoja de cálculo B1 como el texto:

CURRENT OWNER 915 BROADWAY ST HOUSTON TX 77012-2126 

en B2 sería su fórmula:

=Get2ndText(B1) 

El resultado sería

TX 
+0

Gracias a Kerry White por su solución. +1 por esto. – SIM

Cuestiones relacionadas