Many ways to do this, depending on yr data layout & exceptions. Try
Original Entry in [Names]: = "John Doe"
Returned by Expression: Doe
Expression:Expr: Right(Trim([Names]),Len(Trim([Names]))-InStr(1, _
[Names]," "))
OR TRY
Original Entry in [Names]: "Doe, John"
Returned by Expression: Doe
Expression: Expr: Left([Names],InStr(1,[Names],",")-1)
OR TRY
Original Entry in [Names]: "John P. Doe"
Returned by Expression: Doe
Expression: Expr: Right(Trim([Names]),Len(Trim([Names]))-InStr(InStr _
(1, [Names]," ")+1,[Names]," "))
OR TRY
Original Entry in [Names]: "John Doe" or "John P. Doe"
Returned by Expression: Doe
Expression: Expr: IIf(InStr(InStr([Names]," ")+1,[Names]," ") _
<>0, Right([names],Len([names])-InStr(InStr([Names]," ")+1, _
[Names]," ")),Right([Names],Len([Names])-InStr([Names]," ")))
AND FAILING THAT
You can use VB Code to split the lot, but try these first.