SEPARAR NOMBRES Y APELLIDOS

El tema de la separación de nombres y apellidos, es una consulta frecuentemente planteada, pero que entraña 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 Martínez Díaz 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 funciónes 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), también se podrán discriminar adecuadamente, basándonos en dicho separador, p. ej.: Juan Antonio - Martínez - Díaz de Almenara, aunque en este caso (y similares) la presencia de los guiones afearía la presentación del texto.

La primera solución expuesta (Hoja 1) está condicionada a que la primera letra (y sólo la primera) de cada apellido esté en mayúscula, con el fin de utilizar este criterio como separador de grupos, p. ej.: Juan antonio Martínez Díaz de almenara, aunque esta solución tampoco es la más elegante ya que podrían existir nombres o apellidos escritos en minúscula, como por ejemplo “antonio”. En esta ocasión me apoyo en una UDF (Función Definida por el Usuario), almacenada en un módulo ordinario, para determinar desde donde y hasta donde llega cada grupo (ver al final).

  

Fórmulas: 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 solución expuesta (Hoja 1) está condicionada a que el separador especial, que separa cada grupo, sea el carácter 160 (mismo que en la solución 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 hándicap que tanto en esta solución como en la anterior, dependemos de la acción responsable del usuario.
  

Fórmulas: 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(CARÁCTER (160);$B18;LARGO($D18)+2)))




En la hoja 2, muestro otra posible solución (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 carácter 160, que simula un espacio en la mayoría 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” podría 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 botón ACEPTAR como no disponible mientras no haya texto en los 3 cuadros de texto, y además 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, también se borrará el del siguiente.

Las fórmulas empleadas en la hoja para separar Nombre, Apellido1 y Apellido2, son las mismas que las empleadas para el ejemplo 2 de la hoja1.





Código VBA
  

Código VBA del módulo de la hoja "Con formulario": '———————————————————————————————————————————————————————————————————————————————————————' ' Mediante un formulario inserto un separador especial º º º º º º ' ' (carácter 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 selección múltiple. 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 Código 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 ' Botón ACEPTAR no disponible. UserFormNomApell.TextBoxNombre.SetFocus ' El CT nombre toma el foco. 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 ' ... botón ACEPTAR no disponible. Else ' Si hay texto en CT apellido2... UserFormNomApell.CommandButton1.Enabled = True ' ... botón ACEPTAR disponible. End If ' ... Len(... End Sub Código VBA del módulo ordinario "MódMayusProx": 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 mayúscula... If Mid(texto, num, 1) > "@" And Mid(texto, num, 1) < "[" Then '... devuelve la _ posición y termina. MayusculaProx = num ' Asigno el valor a devolver. Exit Function ' Salgo de la UDF. End If ' ... Mid(... Next num End Function ' MayusculaProx



Volver arriba