여러 행의 값을 단일 행으로 결합하는 방법

여러 행의 값을 단일 행으로 결합하는 방법

2250개의 행과 19개의 열이 있는 Excel 2007 스프레드시트가 있습니다. 이 행에는 결합해야 하는 두 개의 중복 고객 정보 행이 있을 수 있지만 위의 셀이 비어 있는 경우에만 가능합니다. 결합할 필요가 없는 고객 데이터 행이 있을 수도 있습니다. 고유한 고객 회원 번호를 사용하여 함께 결합해야 하는 행을 식별할 수 있습니다. 고유한 고객 데이터를 하나의 행(위)으로 결합하고 결합 후 남은 행을 삭제하는 올바른 VBA 스크립트를 개발하는 데 어려움을 겪고 있습니다. 도와주실 분 계신가요? 이 행을 결합하는 데 드는 시간/일을 절약할 수 있으며 현재 시간에 민감한 감사가 진행 중입니다.

데이터 샘플:

회원 이름 회원 성 회원 번호 MVP 시스템 참가 날짜 등록 날짜 MVP 포인트 추첨 참가 등록 양식? 포인트가 맞나요? 누락된 포인트 최종 포인트 도면 항목 SP Talon # WP Talon # BD DEPT 직원 메모 DLR
Gene S 550061 2013/3/2 0 0 0 #N/A                            
진 S 550061 2013-03-2 1539 137 MC MJ SP
스티브 G 550087 2013-03-2 30019 1588 PA NR WP
커티스 S 550128 2013-04-24 5 0 5 #N/A                            
Curt S 550128 2013-04-24 358 47 MC MJ SP

제목의 공백에 밑줄이 있는 파이프/단락 구분 버전을 추가하려면 편집(OP가 아님):

MEMBER_FIRST_NAME|MEMBER_LAST_NAME|MEMBER_#|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|EMPLOYEE|참고 S|DLR
유전자|S|550061|03/ 2013년 2월||0|0||||0|#N/A|||||||
진|S|550061||2013년 2월 3일||||||||1539|137||MC|MJ||SP
스티브|G|550087||2013년 3월 2일||||||| |30019|1588||PA|NR||WP
커티스|S|550128|2013/4/24||5|0||||5|#N/A|||||||
커트|S|550128||2013년 4월 24일||||||||358|47||MC|MJ||SP

답변1

귀하가 제공한 설명이 확실하지 않지만 어쨌든 여기에 있습니다!:

핵심 사항 - 다음은 MEMBER # MVP SYSTEM ENTRY DATE 내에서 항상 ENROLL DATE보다 높은 것으로 가정합니다.

안전을 위해 복사본 작업을 하고 각 행에 색인 번호를 추가합니다(예: insert ColumnA, put 1in A1, =A1+1그리고 A2수식을 Row2250까지 복사합니다. ColumnA상단에 특수/값을 복사하여 붙여넣습니다.

, 홈 > 스타일 – 조건부 서식, 새 규칙, 수식 D2을 사용하여 서식을 지정할 셀 결정, 이 수식이 true인 값의 서식 지정: 삽입 =AND(NOT(ISBLANK(D2)),OR(D1=D2,D2=D3)), 서식, 채우기, 노란색 선택, 확인, 확인. 조건부 서식 - 규칙 관리의 입력에 적용에서 적용 =$D$2:$D$2250을 선택합니다. 좋아요.

전체 스프레드시트를 선택하고(제목에서 A 왼쪽과 1 위에 있는 삼각형 클릭), 데이터 > 정렬 및 필터 –필터를 선택하고 ColumnD색상별 필터링에서 노란색을 선택합니다.

파란색으로 번호가 매겨진 마지막 행까지 Row1을 복사하고 A1다른 시트(예: Sheet2)에 붙여넣습니다.

Sheet2에서 삭제하고 F1셀을 위로 이동하고 확인합니다. 또한 N1:T1. (여기서 추가적인 시선이 필요할 수 있습니다.)

ColumnASheet2에 새 항목을 추가합니다 . , , 선택 1하고 선택 항목의 오른쪽 하단 모서리를 잡고 마우스 왼쪽 버튼을 누른 채 필요한 만큼 아래로 드래그하고 을 누른 상태를 유지 합니다 . A12A2A1:A2Ctrl

Sheet2를 선택하고 데이터 > 정렬 및 필터 – 정렬을 선택하고 내 데이터에 머리글이 있는지 확인하고 정렬 기준 ColumnA(첫 번째 1!), 값 기준 정렬, 가장 작은 것부터 가장 큰 것까지 순서, 확인을 선택합니다.

2Sheet2를 포함 하는 가장 낮은 행 번호 ColumnA와 가장 높은 점유 행의 번호를 기록해 둡니다. 삭제 ColumnA.

첫 번째 시트로 돌아가서 노란색 강조 표시가 포함된 모든 행을 삭제하세요.

Sheet2에서 낮은 행 번호와 더 높은 번호가 있는 다른 모든 점유 행을 선택하고 ColumnA첫 번째 시트의 맨 아래로 다시 붙여넣습니다.

바라건대 이것이 귀하가 요구하는 대부분을 달성하거나, 그렇지 않다면 '올바른 방향으로 나아가는 단계'입니다! 확인하려면 이제 마지막으로 점유된 행이 2250+1에서 위에서 언급한 두 숫자의 차이를 뺀 값이어야 합니다.

회원 이름을 확인하려면 회원 번호와 그 조회 테이블을 만든 다음 복사한 시트에서 이를 기준으로 회원 이름을 비교하는 것이 좋습니다. Curt 또는 Curtis는 아마도 판단을 요구할 것입니다.

답변2

또 다른 가능한 접근 방식이 있습니다. 이는 세 가지 조건에 따라 달라집니다.

  • 중복 필드와 중복되지 않은 필드를 구별하려면 고유 식별자를 사용할 수 있어야 합니다. 이 경우 MEMBER# 필드가 해당 용도로 사용됩니다. 다른 경우에는 식별자가 여러 필드의 값 조합으로 구성될 수 있습니다. 이 ID는 단일 필드의 값이거나 여러 필드의 값의 합성일 수 있습니다.
  • MEMBER#의 중복은 최대 2개입니다. 즉, 3중 이상의 다중 "중복" 레코드는 허용되지 않습니다.
  • 행은 MEMBER# 식별자를 기준으로 정렬됩니다.

아이디어는 기존 테이블의 오른쪽에 가장 편리하게 변환된 테이블을 구성하는 것입니다. 이 테이블은 수식을 사용하여 두 개의 중복 행 간에 공유되는 부분 데이터를 단일 행으로 통합하고 하나의 채워진 행과 하나의 행을 비워 둡니다. 열.

이 작업이 완료되면 필터를 결과 테이블에 적용하여 빈 행을 제외하고 채워진 행을 다른 위치에 복사할 수 있습니다.

아래와 같이 A열에 플래그 필드 "DUP"를 추가했습니다. C열의 MEMBER#가 이전 행의 MEMBER#와 같으면 1이고 그렇지 않으면 0입니다. 중복된 MEMBER#가 있는 예제 데이터의 두 행 세트는 노란색으로 강조 표시됩니다.

"DUP" 플래그 필드가 추가된 데이터 세트

수식의 결과 테이블은 다음과 같습니다. 예상한 대로 두 레코드 간에 공유되었던 보완적인 정보가 한 레코드에 모아졌고, 다른 레코드는 이중 대시("--")로 채워졌습니다. (예제 데이터에서 두 세트의 중복 행은 표에서 더 진한 파란색으로 강조 표시됩니다.)

MEMBER# 550061에 대한 중복 버전이 포함된 테이블의 처음 두 행을 보면 MEMBER_FIRST_NAME 열의 4행에 있는 두 번째 "Gene"이 "--"로 대체되었습니다. 3행에서 이전에 비어 있던 ENROLLMENT_DATE가 이제 2013년 3월 2일로 채워지고 4행에서 위로 이동됩니다. 두 번째 DRAWING_ENTRIES 필드(원래 테이블의 M 열, 새 테이블의 AS 열)의 N/A 값은 공백으로 대체되었습니다.

중복 행이 플래그 지정되고 비어 있는 변환된 테이블

이제 남은 작업은 필터를 적용하고, DUP 열을 기준 열로 사용하고, DUP가 0인 행만 선택하고 결과를 새 위치에 복사하는 것입니다.

필터링된 데이터 세트

중복 항목을 통합하는 데 사용되는 공식은 본질적으로 구조가 동일하므로 자세히 살펴보는 것이 좋습니다. 다음은 MEMBER_FIRST_NAME 열에 대한 AH3 셀의 표에 있는 첫 번째 수식입니다(결과 표의 첫 번째 행에 대한 전체 수식 집합은 이 게시물 끝에 포함되어 있습니다).

=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

코드에 대한 추가 설명: IFERROR(<cell address>="",FALSE)일부 행에서 N/A 오류 값을 적절하게 선별하려면 다소 우회적인 표현이 필요합니다.

결과 테이블의 첫 번째 행에 대한 코드

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))))

관련 정보