나는 Excel에서 두 개의 다른 값에 대한 연간 고객 데이터로 구성된 데이터 덤프를 가지고 있습니다. 이 데이터에는 매년 고객과 고객의 가치에 대한 별도의 행이 제공되었습니다. 나. 다음과 같이 보입니다.
2009 년 Value A에 대한 고객 1의 행에 계속 머물러 있습니다. 별도의 행 값 B에 대한 같은 고객이 같은 년.
경우에 따라 값 A 또는 값 B가 없습니다. 위 예에서 2011 년 고객 1에는 값 B가 없으므로 해당 행이 생성되지 않았 음을 알 수 있습니다. 그리고이 예제에서는 나타내지 않았지만 일부 클라이언트는 1 년 중 어느 값에 대한 데이터도 갖지 않습니다 (따라서 해당 연도에 해당 고객에 대한 행이 없음). 그 상황에서, 그 해에 그 고객에 대한 행이 부족한 것이 좋습니다.
이것을 워크 시트에 넣고 싶습니다. 한 줄 …에 대한 양자 모두 매년 및 고객 별 가치 즉, 데이터를 다음과 같이 표시합니다.
그 결과를 창출하는 가장 효과적인 방법은 무엇입니까?
답변
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
답변
다른 옵션 :
- B 열을 선택하고를 누릅니다. CTRL + G & gt;
Special
& gt;Blanks
& gt;OK
- 유형
=
프레스 ↑ , 그 다음에 CTRL + ENTER - C 열을 선택하고를 누릅니다. CTRL + G & gt;
Special
& gt;Blanks
& gt;OK
- 유형
=IF(
프레스 ← 유형=
프레스 ← 프레스 ↓ 유형,
프레스 ↓ 유형,0)
그때 CTRL + ENTER - 모든 데이터를 선택하고
Copy
과Paste Special as Values
- 중복을 제거하십시오.
편집하다:
설명: 나는 고토 블랭크스 선택권. 공백을 선택하면 선택한 모든 공백 셀에 대해 동일한 수식을 입력 할 수 있습니다. OP 질문에 대해서는 데이터가 다음과 같이 보입니다. 일관된 공백, 즉 : Value A
열 공백은 같음 CustomerID
위의 비 공백 행과 같습니다. 같은 방법으로 Value B
열 공백은 같음 CustomerID
비 공백 행 아래에.
답변
가장 효과적인 방법은 모든 데이터를 피벗 테이블에 덤프하고 ‘고객’을 행 레이블에 놓은 다음 다른 열을 후속 조치하는 것입니다. 연도 별 분류를 보려면 ‘연도’를 열 헤더에 놓을 수 있습니다.
피벗 테이블은 Excel 2010에서 삽입 아래에 있습니다.
답변
응축 된 데이터로 별도의 테이블을 생성하는 단계는 다음과 같습니다.
- 전체 표를 복사하여 새 시트에 붙여 넣으십시오.
- 열에서 새 표를 선택하고 중복 항목 제거 (데이터 리본 – & gt; 중복 항목 제거)
Customer
과Year
. 이것은 응축 된 테이블에 대한 프레임 워크를 제공합니다. -
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 + 시프트 + 들어가다 .
-
수식을 열 아래로 채 웁니다. 그런 다음 채워서
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의 값을 수식을 제거하기 위해 붙여넣고 고객별로 정렬하여 모든 추가 행을 제거합니다.