태그 보관물: microsoft-excel-2007

microsoft-excel-2007

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

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

enter image description here

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

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

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

enter image description here

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



답변

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


답변

다른 옵션 :

  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 비 공백 행 아래에.


답변

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

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


답변

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

  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 솔루션을 사용하는 것이 좋습니다.

답변

누구나이 작업을 위해 많은 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의 값을 수식을 제거하기 위해 붙여넣고 고객별로 정렬하여 모든 추가 행을 제거합니다.


답변