Excel - separar nombres y apellidos

 
Vista:

separar nombres y apellidos

Publicado por Luis (2 intervenciones) el 26/05/2012 12:22:12
Hola
Queria separar nombres y apellidos que tengo en una misma celda a celdas: Nombre, Apellido1, Apellido2
El problema que me encuentro es al separar nombres tales como maria jose....
ejemplo

Nombre completo nombre apellido1 apellido2
juan diaz lópez juan diaz lopez
maria jose perez valcarce maria jose perez valcarce
ana maria pardo vazquez ana maria pardo vazquez

Un saludo y gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

separar nombres y apellidos

Publicado por Martha (330 intervenciones) el 26/05/2012 13:07:59
No hay forma porque nuestro nombre y apellidos no siguen un patrón como pueda ser el de los estadounidenses que ponen nombre, inicial del segundo nombre y un solo apellido.
Aquí, al menos en España, hay nombres que también son apellido, y no todo el mundo tiene un nombre compuesto como suele ocurrir en latino américa. Y hay casos en los que teniendo un nombre compuesto solo usamos y nos registramos con uno.
Bien, lo que yo he hecho cuando he tenido que limpiar una Base de datos, con algunos miles de nombres ha sido separarlos por el espacio, haciendo uso de la función encontrar, y metiendo el espacio entre dos comillas. La función encontrar te da la posición del espacio, la función largo el número de caracteres, y si restas la posición del primer espacio con el número de caracteres, la función izquierda te extrae el nombre. Lo repites un par de veces y puedes separar cada uno de los elementos. Después los ordenas y en una columna aparte seleccionas (a mano) si es nombre o apellido. Es tedioso, pero es la única forma que he visto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

separar nombres y apellidos

Publicado por Luis (2 intervenciones) el 26/05/2012 14:08:28
aver yo lo que di hecho fue esto:
pero para ello tengo que tener en el orden siguiente:
apellido1+apellido2+nombre, de esta manera me lo deja hacer asi:

nombre: =EXTRAE((REEMPLAZAR((B2);(HALLAR(" ";(B2)));1;""));(HALLAR(" ";(REEMPLAZAR((B2);(HALLAR(" ";(B2)));1;""))))+1;((LARGO((REEMPLAZAR((B2);(HALLAR(" ";(B2)));1;""))))-(HALLAR(" ";(REEMPLAZAR((B2);(HALLAR(" ";(B2)));1;""))))))
apellido1: =IZQUIERDA(B2;(HALLAR(" ";B2))-1)
apellido 2: =IZQUIERDA((DERECHA(B2;(LARGO(B2))-(HALLAR(" ";B2))));(HALLAR(" ";(DERECHA(B2;(LARGO(B2))-(HALLAR(" ";B2))))))-1)

yo pretendo hacer esto mismo pero cuando los datos los tenga de la siguiente manera
nombre+apellido1+apellido2

es decir habria que empezar a buscar por la parte derecha(en lugar de la izaquierda, como hice anteriormete) para asi dejar los nombre complejos para el final.

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

separar nombres y apellidos

Publicado por JuanC (1237 intervenciones) el 26/05/2012 18:25:59
Como no tenía nada que hacer... me puse a hacer algo al respecto...
Hice una macro que combina nombres y apellidos (hasta 4 palabras en total)
y crea una lista desplegable ordenada con las combinaciones posibles...
Sólo queda por elegir la opción correcta en cada lista...
Quizá no sea lo mejor, pero creo que puede ayudar... y además es adaptable a otros problemas...

En el ejemplo los datos están en el rango A1:A100 y las listas aparecen en la columna B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
Option Explicit
Option Private Module
 
'//By JuanC - 26 May. 2012
 
Private Const cSEP = ";"  '//El separador NO puede ser una coma (,)
 
Sub main()
Dim s$, i%, p%, t$
Dim rng As Range, c As Range
Dim m(4) As String
On Error Resume Next
Application.ScreenUpdating = False
Set rng = Range("A1:A100")
For Each c In rng
    s = VBA.LCase(c.Text)
    s = fClear(s)
    If s = "" Then GoTo siga
    p = 0
    For i = 0 To 3
        m(i) = ""
        m(i) = VBA.Split(s, " ")(i)
        If m(i) <> "" Then p = p + 1
    Next
    If p = 1 Then
       Call AddList(c.Offset(0, 1), Excel.WorksheetFunction.Proper(s) & ",")
    ElseIf p = 2 Then
           t = VBA.Mid(s, 1, VBA.InStr(1, s, " ") - 1) & "; " & VBA.Trim(VBA.Mid(s, VBA.InStr(1, s, " ") + 1, VBA.Len(s))) & ","
           t = t & VBA.Trim(VBA.Mid(s, VBA.InStr(1, s, " ") + 1, VBA.Len(s)) & "; " & VBA.Mid(s, 1, VBA.InStr(1, s, " ") - 1))
           Call AddList(c.Offset(0, 1), Excel.WorksheetFunction.Proper(t))
    ElseIf p = 3 Then
           Call g3(c, m(0), m(1), m(2))
    ElseIf p = 4 Then
           Call g4(c, m(0), m(1), m(2), m(3))
    Else
        c.Offset(0, 1).Value = ""
    End If
siga:
Next
Application.ScreenUpdating = True
MsgBox "Proceso finalizado!"
End Sub
 
Private Sub g3(rngPivot As Range, a$, b$, c$)
Dim v As Variant, i%, j%, m As Variant, s$
Dim lst() As Variant, n%
m = Array("A.BC", "B.AC", "C.AB", "BA.C", "CA.B", "CB.A")
For j = 0 To UBound(m)
    v = cmb3(m(j), a, b, c)
    For i = 0 To 1
        ReDim Preserve lst(n)
        lst(n) = v(i)
        n = n + 1
    Next
Next
Call fQuickSort(lst, 0, UBound(lst))
s = ""
For i = 0 To UBound(lst)
    s = s & "," & Excel.WorksheetFunction.Proper(lst(i))
Next
Call AddList(rngPivot.Offset(0, 1), VBA.Mid(s, 2))
Erase lst
End Sub
 
Private Sub g4(rngPivot As Range, a$, b$, c$, d$)
Dim v As Variant, i%, j%, m As Variant, s$
Dim lst() As Variant, n%
m = Array("A.BCD", "A.BDC", "A.CBD", "A.CDB", "A.DBC", "A.DCB", "B.ACD", "B.ADC", "B.CAD", "B.CDA", "B.DAC", "B.DCA", _
          "C.ABD", "C.ADB", "C.BAD", "C.BDA", "C.DAB", "C.DBA", "D.ABC", "D.ACB", "D.BAC", "D.BCA", "D.CAB", "D.CBA", _
          "AB.CD", "AB.DC", "AC.BD", "AC.DB", "AD.BC", "AD.CB", "BA.CD", "BA.DC", "BC.DA", "BD.CA", "CB.DA", "DB.CA")
n = 0
For j = 0 To UBound(m)
    v = cmb4(m(j), a, b, c, d)
    For i = 0 To 1
        ReDim Preserve lst(n)
        lst(n) = v(i)
        n = n + 1
    Next
Next
Call fQuickSort(lst, 0, UBound(lst))
s = ""
For i = 0 To UBound(lst)
    s = s & "," & Excel.WorksheetFunction.Proper(lst(i))
Next
Call AddList(rngPivot.Offset(0, 1), VBA.Mid(s, 2))
Erase lst
End Sub
 
Private Function cmb3(s As Variant, a$, b$, c$) As Variant
Dim v(2) As String
Dim t$
t = VBA.Replace(s, "A", a & " ")
t = VBA.Replace(t, "B", b & " ")
t = VBA.Replace(t, "C", c & " ")
t = VBA.Replace(t, ".", cSEP)
t = VBA.Trim(VBA.Replace(t, " " & cSEP, cSEP & " "))
t = VBA.Replace(t, "  ", " ")
v(0) = (t)
v(1) = VBA.Trim(VBA.Mid(t, VBA.InStr(1, t, cSEP) + 1, VBA.Len(t)) & cSEP & " " & VBA.Mid(t, 1, VBA.InStr(1, t, cSEP) - 1))
cmb3 = v
End Function
 
Private Function cmb4(s As Variant, a$, b$, c$, d$) As Variant
Dim v(2) As String
Dim t$
t = VBA.Replace(s, "A", a & " ")
t = VBA.Replace(t, "B", b & " ")
t = VBA.Replace(t, "C", c & " ")
t = VBA.Replace(t, "D", d & " ")
t = VBA.Replace(t, ".", cSEP)
t = VBA.Trim(VBA.Replace(t, " " & cSEP, cSEP & " "))
t = VBA.Replace(t, "  ", " ")
v(0) = (t)
v(1) = VBA.Trim(VBA.Mid(t, VBA.InStr(1, t, cSEP) + 1, VBA.Len(t)) & cSEP & " " & VBA.Mid(t, 1, VBA.InStr(1, t, cSEP) - 1))
cmb4 = v
End Function
 
Private Sub AddList(rng As Range, s$)
On Error Resume Next
With rng.Validation
     .Delete
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=(s)
     .IgnoreBlank = True
     .InCellDropdown = True
     .InputTitle = ""
     .ErrorTitle = ""
     .InputMessage = ""
     .ErrorMessage = ""
     .ShowInput = True
     .ShowError = True
End With
rng.Value = VBA.Mid(s, 1, VBA.InStr(1, s, ",") - 1)
End Sub
 
Private Function fClear(ByVal s As String) As String
Dim i%
s = VBA.Replace(s, ",", "")
s = VBA.Replace(s, ".", "")
s = VBA.Replace(s, ";", "")
s = VBA.Replace(s, "-", "")
s = VBA.Replace(s, "_", "")
For i = 20 To 2 Step -1
    s = VBA.Replace(s, String(i, " "), " ")
Next
fClear = s
End Function
 
Private Sub fQuickSort(vArray As Variant, l As Long, R As Long)
Dim i As Long, j As Long
Dim X, Y
i = l
j = R
X = vArray((l + R) / 2)
Do While (i <= j)
   DoEvents
   Do While (vArray(i) < X And i < R)
             i = i + 1
   Loop
   Do While (X < vArray(j) And j > l)
             j = j - 1
   Loop
   If (i <= j) Then
      Y = vArray(i)
      vArray(i) = vArray(j)
      vArray(j) = Y
      i = i + 1
      j = j - 1
   End If
Loop
If (l < j) Then fQuickSort vArray, l, j
If (i < R) Then fQuickSort vArray, i, R
End Sub


Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar