You are on page 1of 7

SEPARAR NOMBRES Y APELLIDOS

El tema de la separacin de nombres y apellidos, es una consulta frecuentemente


planteada, pero que entraa cierta dificultad debido a que el problema con el que
nos encontramos para resolver el tema, es la existencia de nombres compuestos
y/o apellidos compuestos, p. ej. Juan Antonio Martnez Daz de Almenara, que
invalidan el espacio como separador.
Cuando no se trate de nombres compuestos ni apellidos compuestos, el tema no
presenta mayor dificultad, ya que podremos usar el espacio como separador y
utilizar las funcines integradas en Excel; ENCONTRAR o HALLAR.
Igualmente si en el momento de introducir los nombres y apellidos, el conjunto
contiene los dos separadores necesarios (iguales y nicos), tambin se podrn
discriminar adecuadamente, basndonos en dicho separador, p. ej.: Juan Antonio
- Martnez - Daz de Almenara, aunque en este caso (y similares) la presencia de
los guiones afeara la presentacin del texto.
La primera solucin expuesta (Hoja 1) est condicionada a que la primera letra (y
slo la primera) de cada apellido est en mayscula, con el fin de utilizar este
criterio como separador de grupos, p. ej.: Juan antonio Martnez Daz de
almenara, aunque esta solucin tampoco es la ms elegante ya que podran existir
nombres o apellidos escritos en minscula, como por ejemplo antonio. En esta
ocasin me apoyo en una UDF (Funcin Definida por el Usuario), almacenada en
un mdulo ordinario, para determinar desde donde y hasta donde llega cada
grupo (ver al final).

Frmulas:

NOMBRE

=SI($B3="";"";MAYUSC(IZQUIERDA($B3;MayusculaProx($B3;2)-2)))

APELLIDO1 =SI(B3="";"";MAYUSC(EXTRAE($B3;MayusculaProx($B3;2);
MayusculaProx($B3;LARGO(D3)+3)-MayusculaProx($B3;2))))
APELLIDO2 =SI(B3="";"";MAYUSC(EXTRAE($B3;MayusculaProx($B3;
LARGO(D3)+3);LARGO($B3)-MayusculaProx($B3;LARGO(D3)+3)+1))

La segunda solucin expuesta (Hoja 1) est condicionada a que el separador


especial, que separa cada grupo, sea el carcter 160 (mismo que en la solucin de
hoja 2), el cual podemos obtener por teclado pulsando la tecla Alt y sin soltarla
escribir 255, acto seguido soltamos la tecla Alt.
Tenemos como hndicap que tanto en esta solucin como en la anterior,
dependemos de la accin responsable del usuario.

Frmulas:
NOMBRE

=SI($B18="";"";IZQUIERDA($B18;HALLAR(CARACTER(160);$B18)-1))

APELLIDO1 =SI($B18="";"";EXTRAE($B18;HALLAR(CARACTER(160);
$B18)+1;LARGO($B18)-LARGO($D18)-LARGO(F18)-2))
APELLIDO2 =SI($B18="";"";DERECHA($B18;LARGO($B18)-HALLAR(CARCTER (160);
$B18;LARGO($D18)+2)))

En la hoja 2, muestro otra posible solucin (esta es mi favorita), que consiste en


introducir nombre y apellidos en la hoja, mediante un formulario, donde
escribiremos nombre y cada apellido en su correspondiente cuadro de texto
(observa la imagen de la derecha), y a la hora de pasar los datos a la hoja inserto
entre cada dos grupos el carcter 160, que simula un espacio en la mayora de las
fuentes, con lo que visualmente refleja un conjunto de nombre y apellidos
normales, con el espacio como separador de palabras. Otro separador no
visible podra ser una pareja de espacios.
El formulario se muestra al hacer clic en una celda que espera un conjunto
nombre-apellidos (columna B), pero no se muestra si la celda ya contiene texto o
si pertenece a otro rango.
El formulario muestra el botn ACEPTAR como no disponible mientras no haya
texto en los 3 cuadros de texto, y adems no permite escribir en un cuadro de
texto sin antes escribir en el anterior. De igual manera si borramos el contenido
de uno de ellos, tambin se borrar el del siguiente.
Las frmulas empleadas en la hoja para separar Nombre, Apellido1 y Apellido2,
son las mismas que las empleadas para el ejemplo 2 de la hoja1.

Cdigo VBA

Cdigo VBA del mdulo de la hoja


"Con formulario":

'
'

' Mediante un formulario inserto un separador especial

'

' (carcter 160) entre nombre y apellido1 y entre

'

' apellido1 y apellido2, y lo escribo en la hoja.

'

'


'

'

Modificado en
'

Mayo de 2011.

'
'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub ' Salgo si es seleccin
mltiple.
If Target.Column = 2 And Target.Value = "" Then
UserFormNomApell.Show ' Si seleccionas _
una celda vacia de la columna B, abro el formulario.
End Sub ' Worksheet_SelectionChange

Cdigo VBA del formulario "UserFormNomApell":


Private Sub CommandButton1_Click()

Dim fila&, nombre$


fila = Cells(Rows.Count, 2).End(xlUp).Offset(1).Row ' Primera
fila libre.
nombre = UserFormNomApell.TextBoxNombre.Value ' Nombre...
If UserFormNomApell.TextBoxApellido1.Value > "" Then nombre =
nombre & _
Chr(160) & UserFormNomApell.TextBoxApellido1.Value ' ... +
separador + apellido1...
If UserFormNomApell.TextBoxApellido2.Value > "" Then nombre =
nombre & _
Chr(160) & UserFormNomApell.TextBoxApellido2.Value ' ... +
separador + apellido2.
Cells(fila, 2).Value = nombre ' Escribo el nombre en la primera
celda libre.
UserFormNomApell.TextBoxNombre.Value = "" ' Borro el CT nombre.
UserFormNomApell.TextBoxApellido1.Value = "" ' Borro el CT
apellido1.
UserFormNomApell.TextBoxApellido1.Enabled = False ' CT apellido1
no disponible.
UserFormNomApell.TextBoxApellido2.Value = "" ' Borro el CT
apellido2.
UserFormNomApell.TextBoxApellido2.Enabled = False ' CT apellido2
no disponible.
UserFormNomApell.CommandButton1.Enabled = False ' Botn ACEPTAR
no disponible.

foco.

UserFormNomApell.TextBoxNombre.SetFocus ' El CT nombre toma el

End Sub ' CommandButton1_Click

Private Sub CommandButton2_Click()


Unload UserFormNomApell ' Cierro y descargo el formulario.
End Sub

Private Sub TextBoxNombre_Change()


If Len(UserFormNomApell.TextBoxNombre.Value) = 0 Then ' Si borras
el nombre...
UserFormNomApell.TextBoxApellido1.Value = "" ' ... borro el
apellido1...
UserFormNomApell.TextBoxApellido1.Enabled = False ' ... y CT
apellido1 no disponible.
Else ' Si hay texto en CT nombre...
UserFormNomApell.TextBoxApellido1.Enabled = True ' ... CT
apellido1 disponible.
End If ' ... Len(...
End Sub ' TextBoxNombre_Change

Private Sub TextBoxApellido1_Change()


If Len(UserFormNomApell.TextBoxApellido1.Value) = 0 Then ' Si
borrar apellido1...
UserFormNomApell.TextBoxApellido2.Value = "" ' ... borro el
apellido2...
UserFormNomApell.TextBoxApellido2.Enabled = False ' ... y CT
apellido2 no disponible.
Else ' Si hay texto en CT apellido1...
UserFormNomApell.TextBoxApellido2.Enabled = True ' ... CT
apellido2 disponible.
End If ' Len(
End Sub ' Sub TextBoxApellido1_Change

Private Sub TextBoxApellido2_Change()


If Len(UserFormNomApell.TextBoxApellido2.Value) = 0 Then ' Si no
hay texto en CT apellido2...

UserFormNomApell.CommandButton1.Enabled = False ' ... botn


ACEPTAR no disponible.
Else ' Si hay texto en CT apellido2...
UserFormNomApell.CommandButton1.Enabled = True ' ... botn
ACEPTAR disponible.
End If ' ... Len(...
End Sub

Cdigo VBA del mdulo ordinario "MdMayusProx":


Function MayusculaProx(texto$, Optional inicio&) As Integer
Dim num&
inicio = inicio - 1 * (inicio = 0) ' si no se expecifica inicio;
inicio=1.
For num = inicio To Len(texto) ' si encuentra una mayscula...
If Mid(texto, num, 1) > "@" And Mid(texto, num, 1) < "[" Then
'... devuelve la _
posicin y termina.
MayusculaProx = num ' Asigno el valor a devolver.
Exit Function ' Salgo de la UDF.
End If ' ... Mid(...
Next num
End Function ' MayusculaProx

You might also like