
Tengo una hoja de cálculo Excel 2007 con 2250 filas y 19 columnas. En estas filas, es posible que tenga dos filas de información duplicada del cliente que deban combinarse, pero solo si la celda de arriba está vacía. También es posible que tenga filas de datos de clientes que no es necesario combinar. Se puede utilizar un número de miembro de cliente único para identificar las filas que deben combinarse. Estoy luchando por desarrollar el script VBA correcto para combinar los datos únicos del cliente en una fila (en la parte superior) y eliminar la fila que queda después de la combinación. ¿Alguien está dispuesto a ayudar? Me ahorrará horas/días de trabajo combinando estas filas y estamos en medio de una auditoría urgente.
Muestra de nuestros datos:
NOMBRE DEL MIEMBRO APELLIDO DEL MIEMBRO # DE MIEMBRO SISTEMA MVP FECHA DE INGRESO FECHA DE INSCRIPCIÓN SORTEO DE PUNTOS MVP INSCRIPCIÓN ¿FORMULARIO DE INSCRIPCIÓN? PUNTOS CORRECTOS? PUNTOS PERDIDOS PUNTOS FINALES ENTRADAS AL SORTEO SP Talon # WP Talon # BD DEPARTAMENTO NOTAS DEL EMPLEADO DLR Gen S 550061 2/3/2013 0 0 0 #N/A Gen S 550061 2/3/2013 1539 137 MC MJ SP Steve G 550087 2/3/2013 30019 1588 PA NR WP Curtis S 550128 24/04/2013 5 0 5 #N/A Curt S 550128 24/04/2013 358 47 MC MJ SP
Edite (no desde OP) para agregar una versión delimitada por tuberías/párrafos con subrayados para espacios en los encabezados:
MIEMBRO_FIRST_NAME|MIEMBRO_APELLIDO_NOMBRE|MIEMBRO_#|MVP_SYSTEM_ENTRY_DATE|ENROLL_DATE|MVP_POINTS|DRAWING_ENTRIES|ENROLL_FORM?|POINTS_CORRECT?|POINTS_MISSED|FINAL_POINTS|DRAWING_ENTRIES|SP_Talon_#|WP_Talon_#|BD|DEPT|EMPLEADO|NO TES|Gen DLR
|S|550061|03/ 02/2013||0|0||||0|#N/A|||||||
Gen|S|550061||03/02/2013||||||||1539|137||MC|MJ||SP
Steve|G|550087||03/02/2013||||||| |30019|1588||PA|NR||WP
Curtis|S|550128|4/24/2013||5|0||||5|#N/A|||||||
Curt|S|550128||24/4/2013||||||||358|47||MC|MJ||SP
Respuesta1
No estoy muy seguro de la aclaración que proporcionaste, ¡pero aquí va de todos modos!:
Punto clave: lo siguiente supone que dentro de MIEMBRO # MVP LA FECHA DE ENTRADA AL SISTEMA siempre aparecerá arriba de la FECHA DE INSCRIPCIÓN.
Por seguridad, trabaje en una copia y agregue un número de índice a cada fila (por ejemplo, insertar ColumnA
, 1
colocar A1
, =A1+1
ingresar A2
y copiar la fórmula hasta la fila 2250. Copie ColumnA
y pegue valores/especiales en la parte superior).
Seleccione D2
, Inicio > Estilos: formato condicional, Nueva regla, Use una fórmula para determinar qué celdas formatear, Formatee los valores donde esta fórmula es verdadera: insertar =AND(NOT(ISBLANK(D2)),OR(D1=D2,D2=D3))
, Formatear, Rellenar, seleccionar amarillo, Aceptar, Aceptar. En Formato condicional - Administrar reglas, en Se aplica para ingresar =$D$2:$D$2250
, Aplicar. DE ACUERDO.
Seleccione la hoja de cálculo completa (haga clic en el triángulo a la izquierda de A y arriba de 1 en los Títulos), Datos > Ordenar y filtrar – Filtrar y para ColumnD
Filtrar por color, seleccione amarillo.
Copie la Fila 1 hasta la última fila numerada en azul y péguela en A1
una hoja diferente (por ejemplo, Hoja 2).
En Hoja2, eliminar F1
, desplazar celdas hacia arriba, Aceptar. También N1:T1
. (Aquí es donde es posible que sea necesario analizar un poco más).
Agregue un nuevo ColumnA
a Sheet2. Coloque , 1
en , seleccione , tome la esquina inferior derecha de la selección, mantenga presionado el botón izquierdo del mouse mientras arrastra hacia abajo tanto como sea necesario y hasta después de presionar y mantener presionado . A1
2
A2
A1:A2
Ctrl
Seleccione Hoja2, Datos > Ordenar y filtrar – Ordenar, marque Mis datos tienen encabezados, Ordenar por ColumnA
(¡el primero de los 1
s!), Ordenar por valores, Ordenar de menor a mayor, Aceptar.
Tenga en cuenta el número de fila más bajo que contiene 2
la ColumnA
Hoja2 y el número de la fila más ocupada. Borrar ColumnA
.
Vuelva a la primera hoja y elimine todas las filas que contengan resaltado en amarillo.
En la Hoja 2, seleccione el número de fila inferior y todas las demás filas ocupadas con un número mayor, copie y vuelva a pegar en ColumnA
la parte inferior de la primera hoja.
Esperemos que esto logre la mayor parte de lo que necesita, o si no, que sea "un paso en la dirección correcta". Para comprobarlo, su última fila ocupada ahora debería ser 2250+1 menos la diferencia entre los dos números indicados anteriormente.
Para verificar el NOMBRE DEL MIEMBRO, sugiero crear una tabla de búsqueda de N.º de MIEMBRO y luego comparar el NOMBRE DEL MIEMBRO sobre esa base en la hoja de la que tomó una copia. Curt o Curtis es presumiblemente una cuestión de criterio.
Respuesta2
Aquí hay otro enfoque posible. Depende de tres condiciones:
- Debe estar disponible un identificador único para distinguir los campos duplicados de los no duplicados. En este caso, el campo MIEMBRO# sirve para ese propósito. En otros casos, el identificador podría construirse como la combinación de los valores de varios campos. Esta identificación podría ser el valor de un solo campo o una combinación de los valores de varios campos.
- No más de dos duplicados de cualquier número de MIEMBRO, es decir, ningún registro "duplicado" triple o superior.
- Las filas se ordenan según el identificador MIEMBRO#.
La idea es construir una tabla transformada, más convenientemente a la derecha de la tabla existente, que utiliza fórmulas para consolidar, en una sola fila, los datos parciales que se comparten entre dos filas duplicadas, dejando una fila llena y otra en blanco. fila.
Una vez hecho esto, se puede aplicar un filtro a la tabla de resultados para excluir las filas en blanco y dejar que las filas completadas se copien en otra ubicación.
Como se muestra a continuación, agregué un campo de marca "DUP" en la columna A: es igual a 1 si un n.º de MIEMBRO en la columna C es igual al n.º de MIEMBRO en la fila anterior y es igual a 0 en caso contrario. Los dos conjuntos de filas en los datos de ejemplo con números de MIEMBRO duplicados están resaltados en amarillo.
Así es como se ve la tabla de resultados de fórmulas. Como era de esperar, la información complementaria que se compartió entre dos registros se reunió en uno de los registros, dejando el otro registro lleno de guiones dobles ("--"). (Los dos conjuntos de filas duplicadas en los datos del ejemplo están resaltados en azul más oscuro en la tabla).
Si observamos las dos primeras filas de la tabla, que contenían versiones duplicadas para el MIEMBRO# 550061, el segundo "Gen" en la fila 4 de la columna MEMBER_FIRST_NAME ha sido reemplazado por "--"; el ENROLLMENT_DATE previamente en blanco en la fila 3 ahora se llena con 3/2/2013, movido hacia arriba desde la fila 4; los valores N/A para el segundo campo DRAWING_ENTRIES (columna M en la tabla original, columna AS en la nueva) se han reemplazado por espacios en blanco.
Todo lo que queda por hacer es aplicar un filtro, usar la columna DUP como columna de criterio, seleccionar solo las filas donde DUP es igual a 0 y copiar el resultado en una nueva ubicación.
Las fórmulas utilizadas para consolidar los duplicados son esencialmente idénticas en estructura, por lo que tiene sentido examinar una detenidamente. Aquí está la primera fórmula de la tabla, de la celda AH3, para la columna MEMBER_FIRST_NAME (al final de esta publicación incluyo el conjunto completo de fórmulas para la primera fila de la tabla de resultados).
=IF($A3=1, If this is row 2 of a DUP set,
"--", Set value of the result cell to "--"
Otherwise it's a row 1 (maybe a dup, maybe not)
IF($A4=0, Is the following row its dup?
IF(IFERROR(B3="",FALSE),"",B3), No, set result to the value on this row
IF(OR(IFERROR(B3="",FALSE),ISERROR(B3)), Yes, but is this row's value blank or error?
IF(IFERROR(B4="",FALSE),"",B4), Yes, use the value from the following row
IF(IFERROR(B3="",FALSE),"",B3)))) No, use the value from this row
Un comentario adicional sobre el código: la locución algo indirecta IFERROR(<cell address>="",FALSE)
es necesaria para descartar correctamente los valores de error N/A en algunas filas.
Código para la primera fila de la tabla de resultados
DUP =IF(D3=D2,1,0)
FNAME =IF($A3=1,"--",IF($A4=0,IF(IFERROR(B3="",FALSE),"",B3),IF(OR(IFERROR(B3="",FALSE),ISERROR(B3)),IF(IFERROR(B4="",FALSE),"",B4),IF(IFERROR(B3="",FALSE),"",B3))))
LNAME =IF($A3=1,"--",IF($A4=0,IF(IFERROR(C3="",FALSE),"",C3),IF(OR(IFERROR(C3="",FALSE),ISERROR(C3)),IF(IFERROR(C4="",FALSE),"",C4),IF(IFERROR(C3="",FALSE),"",C3))))
MEMBER# =IF($A3=1,"--",IF($A4=0,IF(IFERROR(D3="",FALSE),"",D3),IF(OR(IFERROR(D3="",FALSE),ISERROR(D3)),IF(IFERROR(D4="",FALSE),"",D4),IF(IFERROR(D3="",FALSE),"",D3))))
ENTRY DT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(E3="",FALSE),"",E3),IF(OR(IFERROR(E3="",FALSE),ISERROR(E3)),IF(IFERROR(E4="",FALSE),"",E4),IF(IFERROR(E3="",FALSE),"",E3))))
ENROL_DT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(F3="",FALSE),"",F3),IF(OR(IFERROR(F3="",FALSE),ISERROR(F3)),IF(IFERROR(F4="",FALSE),"",F4),IF(IFERROR(F3="",FALSE),"",F3))))
MVP_PTS =IF($A3=1,"--",IF($A4=0,IF(IFERROR(G3="",FALSE),"",G3),IF(OR(IFERROR(G3="",FALSE),ISERROR(G3)),IF(IFERROR(G4="",FALSE),"",G4),IF(IFERROR(G3="",FALSE),"",G3))))
ENTRIES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(H3="",FALSE),"",H3),IF(OR(IFERROR(H3="",FALSE),ISERROR(H3)),IF(IFERROR(H4="",FALSE),"",H4),IF(IFERROR(H3="",FALSE),"",H3))))
FORM =IF($A3=1,"--",IF($A4=0,IF(IFERROR(I3="",FALSE),"",I3),IF(OR(IFERROR(I3="",FALSE),ISERROR(I3)),IF(IFERROR(I4="",FALSE),"",I4),IF(IFERROR(I3="",FALSE),"",I3))))
PTS_CORRECT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(J3="",FALSE),"",J3),IF(OR(IFERROR(J3="",FALSE),ISERROR(J3)),IF(IFERROR(J4="",FALSE),"",J4),IF(IFERROR(J3="",FALSE),"",J3))))
PTS_MISSED =IF($A3=1,"--",IF($A4=0,IF(IFERROR(K3="",FALSE),"",K3),IF(OR(IFERROR(K3="",FALSE),ISERROR(K3)),IF(IFERROR(K4="",FALSE),"",K4),IF(IFERROR(K3="",FALSE),"",K3))))
FINAL_PTS =IF($A3=1,"--",IF($A4=0,IF(IFERROR(L3="",FALSE),"",L3),IF(OR(IFERROR(L3="",FALSE),ISERROR(L3)),IF(IFERROR(L4="",FALSE),"",L4),IF(IFERROR(L3="",FALSE),"",L3))))
DR_ENTRIES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(M3="",FALSE),"",M3),IF(OR(IFERROR(M3="",FALSE),ISERROR(M3)),IF(IFERROR(M4="",FALSE),"",M4),IF(IFERROR(M3="",FALSE),"",M3))))
SP_TALON =IF($A3=1,"--",IF($A4=0,IF(IFERROR(N3="",FALSE),"",N3),IF(OR(IFERROR(N3="",FALSE),ISERROR(N3)),IF(IFERROR(N4="",FALSE),"",N4),IF(IFERROR(N3="",FALSE),"",N3))))
WP_TALON =IF($A3=1,"--",IF($A4=0,IF(IFERROR(O3="",FALSE),"",O3),IF(OR(IFERROR(O3="",FALSE),ISERROR(O3)),IF(IFERROR(O4="",FALSE),"",O4),IF(IFERROR(O3="",FALSE),"",O3))))
BD =IF($A3=1,"--",IF($A4=0,IF(IFERROR(P3="",FALSE),"",P3),IF(OR(IFERROR(P3="",FALSE),ISERROR(P3)),IF(IFERROR(P4="",FALSE),"",P4),IF(IFERROR(P3="",FALSE),"",P3))))
DEPT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(Q3="",FALSE),"",Q3),IF(OR(IFERROR(Q3="",FALSE),ISERROR(Q3)),IF(IFERROR(Q4="",FALSE),"",Q4),IF(IFERROR(Q3="",FALSE),"",Q3))))
EMPL =IF($A3=1,"--",IF($A4=0,IF(IFERROR(R3="",FALSE),"",R3),IF(OR(IFERROR(R3="",FALSE),ISERROR(R3)),IF(IFERROR(R4="",FALSE),"",R4),IF(IFERROR(R3="",FALSE),"",R3))))
NOTES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(S3="",FALSE),"",S3),IF(OR(IFERROR(S3="",FALSE),ISERROR(S3)),IF(IFERROR(S4="",FALSE),"",S4),IF(IFERROR(S3="",FALSE),"",S3))))
DLR =IF($A3=1,"--",IF($A4=0,IF(IFERROR(T3="",FALSE),"",T3),IF(OR(IFERROR(T3="",FALSE),ISERROR(T3)),IF(IFERROR(T4="",FALSE),"",T4),IF(IFERROR(T3="",FALSE),"",T3))))