Esta pregunta es una consecuencia de una pregunta anterior:Fórmula de Excel: fórmula de separación de nombres para personas que tienen apellidos de varias partes:.
Contexto
Tengo una lista de más de 20.000 contactos donde hay una única columna de "Nombre completo". Necesito crear dos columnas para Nombre y Apellido. Sin embargo, no todos los nombres se ajustan a ese patrón simple. La lista incluye nombres como:
David Batte
Guy-Mael Jacobe de Naurois
Jean-Marc Lioutier
Thibaud Le Seguillon
Mrs. Manuela Junghaehnel
Hussain Mohammed Dipu Kabir
Como resultado de la pregunta anterior, estoy atacando el problema separando colecciones de nombres que se ajustan a patrones particulares a los que puedo aplicar reglas de análisis apropiadas. Una cantidad relativamente pequeña de patrones me permitirá automatizar el análisis de la mayor parte de la lista, haciendo que el resto sea una tarea más manejable.
Esta pregunta
Una parte sustancial de la lista de nombres completa contiene solo un nombre y apellido, que son fáciles de analizar. Mi objetivo con esta pregunta es identificar esos nombres de dos nombres para poder separarlos del resto de la lista.
Respuesta1
Hay varias formas de identificar casos en los que los nombres de una lista contienen solo dos nombres de componentes, como nombre y apellido. Esa condición está definida por los espacios que separan los nombres de los componentes.
Método 1
Esta pregunta es una rama de una anterior (Fórmula de Excel: fórmula de separación de nombres para personas que tienen apellidos de varias partes:), donde ya comentamos en los comentarios la identificación de casos de un solo nombre, como solo nombre o apellido. Si ya eliminó esos nombres de la lista, por lo que se garantiza que cada entrada tendrá al menos dos nombres, puede usar una técnica similar aquí y desarrollarla.
Este enfoque busca un espacio y luego, a partir de ahí, busca otro espacio. Si puede encontrar un segundo espacio, la entrada tiene más de dos nombres de componentes. Si la entrada está en A1, la fórmula básica sería:
=FIND(" ",TRIM(A1),FIND(" ",TRIM(A1))+1)
El resultado de esto será un número (ubicación del siguiente espacio) o un #VALOR. error si no lo hay. ¡El valor! El error será fácil de detectar e identifica entradas de dos nombres. Tenga en cuenta que también identificará entradas de un solo nombre, por lo que este método solo funcionará si ya las ha eliminado.
Puede hacer que esto sea más atractivo visualmente probando el resultado para la condición de error y luego mostrando un mensaje de texto para los casos de dos nombres o un espacio en blanco. Envolver la fórmula anterior en una prueba IF le daría una fórmula como esta:
=IF(ISERROR(FIND(" ",TRIM(A1),FIND(" ",TRIM(A1))+1)),"Just 2","")
Método 2
Otro enfoque es contar los espacios. De hecho, podría utilizar este enfoque para encontrar cualquier número específico de espacios, por lo que simplemente cambiar el recuento objetivo le permitirá encontrar también las entradas de un solo nombre. Este enfoque cuenta los espacios eliminando todos los espacios y viendo cuántos caracteres se reduce la cadena. La comparación de longitud produce el recuento de espacios. Lo envuelves con una prueba IF para hacer lo que quieras con el número resultante. La fórmula para marcar entradas con dos nombres (es decir, un solo espacio) se vería así:
=IF(LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))=1,"Just 2","")
Respuesta2
Dejaré un método más simple quePuede que no sea óptimopara 20000 filas.
- Divida los nombres por espacios usando Datos -> Texto en columnas
- Los nombres se dividirán en cuatro columnas A, B, C y D.
- haga clic en filtrar y filtrar
blanks
en la columna C - solo aparecerán los nombres de dos palabras en A y B. Cópielos.
- puedes unir los nombres usando
=TEXTJOIN(" ",TRUE,A1:B1)
Respuesta3
Me gustaría sugerir dos métodos posibles, el primero es Non VBA y el otro es VBA.
Método 1:
Cómo funciona:
- Ingrese esta fórmula en la celda
H2
para crear valores auxiliares (Identificar partes de nombres.) y rellénelo.
=LEN(G2)-LEN(SUBSTITUTE(G2," ",""))
- Escriba criterios
2
en la celdaH1
. Ingrese esta fórmula de matriz en la celda
I2
, termine conCtrl+Mayús+Entrary llenarlo.{=IFERROR(INDEX($G$2:$G$14,SMALL(IF(H$1=$H$2:$H$14,ROW($G$2:$G$14)- MIN(ROW($G$2:$G$14))+1,""), ROW()-1)),"")}
NÓTESE BIEN
- Al cambiar los criterios en la celda
H1
a1
o3
puede obtener una lista de dos y más de 3 nombres de partes.
Método 2:
Dado que se trata de más de 20000 filas, VBA (Macro) será el método más rápido para finalizar el trabajo.
Cómo funciona:
- Botón derecho del ratónPestaña Hoja y desde el menú emergente presioneVer códigopara obtener el editor VB.
Copiar pegareste código como módulo estándar, y finalmenteCORRERla Macro.
Sub DeleteMorethan2() Dim r As Integer, c As Integer, space_count As Integer For r = 2 To 15 space_count = 0 For c = 1 To Len(Range("A" & r)) If Mid(Range("A" & r), c, 1) = " " Then space_count = space_count + 1 If space_count > 1 Then Range("A" & r).ClearContents Next Next End Sub
Obtienes esto:
NÓTESE BIEN
- Este código está funcionando
Rows 2 to 15
y, al editar esta parteFor r = 2 To 15
, puede incluir más filas. - La columna utilizada es
A
, que también es editable.
Además, me gustaría sugerir una fórmula de matriz para volver a crear la lista de nombres eliminando filas en blanco.
Ingrese esta fórmula de matriz en la celda
B2
, termine conCtrl+Mayús+EntrarY llénelo.{=IFERROR(INDEX(A$2:A$14,SMALL(IF(A$2:A$14<>"",ROW(A$2:A$14)-ROW(A$2)+1),ROWS(B$2:B2))),"")}
Ajuste las referencias de celda en la Fórmula según sea necesario.