Excel에서 여러 행의 값을 단일 행으로 결합하는 방법은 무엇입니까?


10

나는 Excel에서 두 개의 다른 값에 대한 연간 고객 데이터로 구성된 데이터 덤프를 가지고 있습니다. 이 데이터에는 매년 고객과 고객의 가치에 대한 별도의 행이 제공되었습니다. 나. 다음과 같이 보입니다.

enter image description here

2009 년 Value A에 대한 고객 1의 행에 계속 머물러 있습니다. 별도의 행 값 B에 대한 같은 고객이 같은 년.

경우에 따라 값 A 또는 값 B가 없습니다. 위 예에서 2011 년 고객 1에는 값 B가 없으므로 해당 행이 생성되지 않았 음을 알 수 있습니다. 그리고이 예제에서는 나타내지 않았지만 일부 클라이언트는 1 년 중 어느 값에 대한 데이터도 갖지 않습니다 (따라서 해당 연도에 해당 고객에 대한 행이 없음). 그 상황에서, 그 해에 그 고객에 대한 행이 부족한 것이 좋습니다.

이것을 워크 시트에 넣고 싶습니다. 한 줄 ...에 대한 양자 모두 매년 및 고객 별 가치 즉, 데이터를 다음과 같이 표시합니다.

enter image description here

그 결과를 창출하는 가장 효과적인 방법은 무엇입니까?

답변:


6

VBA 또는 시트에서 실행할 수있는 매크로입니다. 너는 명중해야한다 대체 + F11 Visual Basic for Applications 프롬프트를 표시하려면 통합 문서로 이동 한 다음 right click - insert - module 이 코드를 붙여 넣으십시오. 그런 다음 VBA 내에서 모듈을 실행할 수 있습니다. F5 . 이 매크로의 이름은 "test"입니다.

Sub test()
'define variables
Dim RowNum as long, LastRow As long
'turn off screen updating
Application.ScreenUpdating = False
'start below titles and make full selection of data
RowNum = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
Range("A2", Cells(LastRow, 4)).Select
'For loop for all rows in selection with cells
For Each Row In Selection
    With Cells
    'if customer name matches
    If Cells(RowNum, 1) = Cells(RowNum + 1, 1) Then
        'and if customer year matches
        If Cells(RowNum, 4) = Cells(RowNum + 1, 4) Then
            'move attribute 2 up next to attribute 1 and delete empty line
            Cells(RowNum + 1, 3).Copy Destination:=Cells(RowNum, 3)
            Rows(RowNum + 1).EntireRow.Delete
        End If
     End If
    End With
'increase rownum for next test
RowNum = RowNum + 1
Next Row
'turn on screen updating
Application.ScreenUpdating = True

End Sub

이것은 정렬 된 스프레드 시트 결합하다 연속 된 행 고객 및 연도 모두와 일치하고 빈 행을 삭제합니다. 스프레드 시트는 사용자가 제시 한 방식, 고객 및 연도 오름차순으로 정렬되어야하며, 이 특정 매크로는 연속적인 행을 넘어서 보일 수 없습니다. .

수정 - 전적으로 가능합니다. with statement 완전히 불필요하지만 아무도 아프지 않습니다.

개정 됨 02/28/14

다른 사람이이 대답을 사용했습니다. 의문 그리고 내가 돌아 왔을 때 나는이 VBA 가난하다고 생각했다. 나는 그것을 다시했다 -

Sub CombineRowsRevisited()

Dim c As Range
Dim i As Integer

For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then
            c.Offset(,3) = c.Offset(1,3)
            c.Offset(1).EntireRow.Delete
End If

Next

End Sub

재검토 05/04/16

다시 물었다. 여러 행의 값을 단일 행으로 결합하는 방법? 모듈이 있지만 설명하는 변수가 필요합니다. 그리고 다시, 그것은 꽤 가난합니다.

Sub CombineRowsRevisitedAgain()
    Dim myCell As Range
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    For Each myCell In Range(Cells("A2"), Cells(lastRow, 1))
        If (myCell = myCell.Offset(1)) And (myCell.Offset(0, 4) = myCell.Offset(1, 4)) Then
            myCell.Offset(0, 3) = myCell.Offset(1, 3)
            myCell.Offset(1).EntireRow.Delete
        End If
    Next
End Sub

그러나 문제에 따라 더 좋을 수도 있습니다. step -1 아무 것도 건너 뛰지 않도록 행 번호에.

Sub CombineRowsRevisitedStep()
    Dim currentRow As Long
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For currentRow = lastRow To 2 Step -1
        If Cells(currentRow, 1) = Cells(currentRow - 1, 1) And _
        Cells(currentRow, 4) = Cells(currentRow - 1, 4) Then
            Cells(currentRow - 1, 3) = Cells(currentRow, 3)
            Rows(currentRow).EntireRow.Delete
        End If
    Next

End Sub

스크립트가 아름답게 작동했습니다. 감사합니다!
Greg R.

2

다른 옵션 :

  1. B 열을 선택하고를 누릅니다. CTRL + G & gt; Special & gt; Blanks & gt; OK
  2. 유형 = 프레스 , 그 다음에 CTRL + ENTER
  3. C 열을 선택하고를 누릅니다. CTRL + G & gt; Special & gt; Blanks & gt; OK
  4. 유형 =IF( 프레스 유형 = 프레스 프레스 유형 , 프레스 유형 ,0) 그때 CTRL + ENTER
  5. 모든 데이터를 선택하고 CopyPaste Special as Values
  6. 중복을 제거하십시오.

편집하다:

설명: 나는 고토 블랭크스 선택권. 공백을 선택하면 선택한 모든 공백 셀에 대해 동일한 수식을 입력 할 수 있습니다. OP 질문에 대해서는 데이터가 다음과 같이 보입니다. 일관된 공백, 즉 : Value A 열 공백은 같음 CustomerID 위의 비 공백 행과 같습니다. 같은 방법으로 Value B 열 공백은 같음 CustomerID 비 공백 행 아래에.


안녕하세요 zx8754. 귀하의 솔루션 뒤에있는 아이디어가 무엇인지 설명을 추가해주십시오.
nixda

@nixda 설명이 추가되었습니다. 죄송합니다. 단계가 충분히 명확하다고 생각했습니다.
zx8754

0

가장 효과적인 방법은 모든 데이터를 피벗 테이블에 덤프하고 '고객'을 행 레이블에 놓은 다음 다른 열을 후속 조치하는 것입니다. 연도 별 분류를 보려면 '연도'를 열 헤더에 놓을 수 있습니다.

피벗 테이블은 Excel 2010에서 삽입 아래에 있습니다.


Excel에서는 B2 및 B3의 값이 다소 관련되어 있다는 것을 알 수 없기 때문에 B 열에 값이없는 셀을 사용하여 문제가 발생합니다.
xXPhenom22Xx

필자는 Pivot Tables에 대한 경험이 거의 없지만 Pivot Tables가 문제를 해결했다고 생각하지 않습니다. 1 년에 한 행의 고객에 대한 모든 값에 대한 데이터를 원하므로 피벗 테이블을 통해 보는 방법을 변경하는 것이 아니라 값 (값 A + 값 B)을 추가하는 등)을 조작 할 수 있습니다. 말 그대로 워크 시트에서 다르게 구조화 된 데이터를 원합니다.
Greg R.

당신이 예제에서와 같이 누락 된 데이터가있는 열을 항상 교체하지 않으면 네가 힘들 것입니다. 이것은 isnt 경우 다음 거기에 Excel에서 논리적으로 당신이 원하는 것을 할 수있는 방법이 없습니다.
xXPhenom22Xx

Greg - 문제를 해결할 수 있습니다. 원하는 피쳐 테이블에 피벗 테이블이 있으면 피벗 테이블 밖으로 다른 시트 (동일한 시트 또는 다른 시트)로 복사 한 다음 원하는 방식으로 조작 할 수 있습니다 수식, 수식 추가 등
yosh m

0

응축 된 데이터로 별도의 테이블을 생성하는 단계는 다음과 같습니다.

  1. 전체 표를 복사하여 새 시트에 붙여 넣으십시오.
  2. 열에서 새 표를 선택하고 중복 항목 제거 (데이터 리본 - & gt; 중복 항목 제거) CustomerYear. 이것은 응축 된 테이블에 대한 프레임 워크를 제공합니다.
  3. B2에서 (첫 번째 항목은 Value A ) 다음을 입력:

    =IFERROR(INDEX(Sheet1!B$1:B$11,MIN(IF(Sheet1!$A$1:$A$11=$A2,IF(Sheet1!$D$1:$D$11=$D2,IF(Sheet1!B$1:B$11<>"",ROW(Sheet1!$A$1:$A$11),1000000),1000000),1000000))),"")

    다음을 눌러 수식을 배열 수식으로 입력하십시오. Ctrl + 시프트 + 들어가다 .

  4. 수식을 열 아래로 채 웁니다. 그런 다음 채워서 Value B 열뿐만 아니라. 빌라!

몇 가지 메모 :

  • 물론 귀하의 데이터에 맞게 주소를 조정해야합니다. 참조를 위해 Sheet1은 A부터 D까지의 원본 데이터입니다.
  • 귀하의 데이터 (또는 헤더)가 행 1에서 시작한다고 가정합니다. 이것이 데이터 덤프 일 경우 아마도 사실 일 것입니다. 그렇지 않은 경우 수식을 조정해야합니다.
  • 네 테이블에 백만 줄이 없다고 가정하고있어. 만약 당신이 그 이상을 가지고 있다면, 1000000 s 수를 행 수보다 큰 값으로 설정하십시오.
  • 테이블에 수천 개의 행 (100,000 개 이상)이있는 경우 배열 수식이 대형 배열로 인해 어려움을 겪을 수 있으므로 VBA 솔루션을 사용하는 것이 좋습니다.

0

누구나이 작업을 위해 많은 VBA 코드 또는 복잡한 기능을 사용하고 있습니다. 구현하는 데는 시간이 걸리지 만 다른 다양한 가능성에 따라 조정하기가 훨씬 쉽고 매우 쉬운 방법이 있습니다.

위에 주어진 예에서이 (4) 함수를 각각 셀 E2, F2, G2 및 H2에 붙여 넣습니다 (위의 F & G 함수 참조 셀).

=IF(D2=D3, A2,         IF(D2<>D1, A2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, B2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, IF(C2=0,"",C2),""))    
=IF(D2=D3, D2,         IF(D2<>D1, D2,            ""))

이 수식을 필요한만큼 아래로 끕니다. 단일 행을 영향을받지 않고 2 행이있을 때마다 단일 행의 데이터를 생성합니다. 다른 곳의 열 E-F-G-H의 값을 수식을 제거하기 위해 붙여넣고 고객별로 정렬하여 모든 추가 행을 제거합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.