Separar Nombres-Apellidos Excel


Por Héctor Miguel Orozco Díaz
MVP MS- Excel
Muchas veces hemos tenido la necesidad de desglosar, separar nombres y apellidos en celdas separadas y hemos visto que es algo un tanto complejo, si además también tenemos nombres y apellidos compuestos, ...puede ser toda una Odisea.
Desarrollo - Separar Nombres y Apellidos
Tenemos la siguiente base de datos en nuestra columna A en una Hoja de Excel
o bien tenemos→
Y ...que nuestros nombre y apellidos son una Extensa columna a Desglosar, a Separar ...
Bien, pues para ello emplearemos el siguiente código
Primer Código
Sub Separa_compuestos()
Application.ScreenUpdating = False
With Range([a2], [a65536].End(xlUp))
.Value = Evaluate("transpose(trim(transpose(lower(" & .Address & "))))")
.Value = Evaluate("transpose(substitute(transpose(substitute(transpose(substitute(transpose(" & _
.Address & "),"" del "","" del|"")),"" de la "","" de|la|"")),"" de los "","" de|los|""))")
.Value = Evaluate("transpose(substitute(transpose(substitute(transpose(substitute(transpose(" & _
.Address & "),"" de las "","" de|las|"")),"" de "","" de|"")),"" y "",""|y|""))")
.TextToColumns Destination:=.Cells(1), DataType:=xlDelimited, Space:=True
With .CurrentRegion: .Cells.Replace What:="|", Replacement:=" "
.Value = Evaluate("transpose(proper(transpose(" & .Address & ")))")
.Cells.Replace What:=" Y ", Replacement:=" y ": .EntireColumn.AutoFit
End With: End With: End Sub
Si tenemos una columna con unos pocos nombres a Desglosar, a Separar ...
Entonces aplicaremos el siguiente código
Segundo Código
Sub Separa_nombres()
Application.ScreenUpdating = False
Dim Quita, Pon, n As Byte
Quita = Array(" del ", " de la ", " de los ", " de las ", " de ", " y ")
Pon = Array(" del|", " de|la|", " de|los|", " de|las|", " de|", "|y|")
With Range([a2], [a65536].End(xlUp))
.Value = Evaluate("transpose(trim(transpose(lower(" & .Address & "))))")
For n = LBound(Quita) To UBound(Quita)
.Cells.Replace What:=Quita(n), Replacement:=Pon(n), MatchCase:=False
Next
.TextToColumns Destination:=.Cells(1), DataType:=xlDelimited, Space:=True
With .CurrentRegion: .Cells.Replace What:="|", Replacement:=" "
.Value = Evaluate("transpose(proper(transpose(" & .Address & ")))")
.Cells.Replace What:=" Y ", Replacement:=" y ": .EntireColumn.AutoFit
End With: End With: End Sub
¿Por qué aplicar uno u otro código?
El primer código para listas +/- extensas de nombre y apellidos, no emplea ningún bucle y por lo tanto nuestro código ira mucho más rápido que en el segundo código que emplea bucle for ...next para realizar los reemplazos originales en listas de pequeñas dimensiones...
Quedándonos así como resultado de ambos códigos

Finalmente no queda otra que "echar OjO" y confirmar si se trata de composiciones:
Un nombre y dos apellidos, dos nombres y un apellido, ¿Cuántos nombres y cuántos apellidos?, etc ...
Y..según nuestra necesidad deberemos entonces utilizar las funciones Concatenar o concatenar Si o bien concatenar.SI que encontraréis en los artículos relacionados en la web
1.- Concatenar matrices
2.- Función concatenado Excel
3.- Función concatenar.SI