
다음 두 개의 열이 있습니다.
Con.By Prod
A 1
A 1
A 2
A 2
B 1
B 1
B 2
B 2
Con.By
열 이나 열 에서 고유한 값을 쉽게 얻을 수 있습니다 Prod
. 그러나 내 요구 사항은 Prod
열의 각 고유 값에 대해 Column의 고유 값을 얻는 것입니다 Con.By
. 따라서 위의 데이터 열에 대해 내가 의도한 출력은 다음과 같습니다.
Con.By Prod
A 1
2
B 1
2
어디서부터 시작해야 할지조차 모르겠습니다. Con.By
각 값에 대한 열을 개별적으로 필터링한 다음 열에서 고유한 값을 찾기 위해 VBA 코드를 작성해 보았습니다 Prod
. 그러나 내 Con.By
열에 너무 많은 항목이 포함되어 있고 그 중 일부는 시간이 지남에 따라 변경될 수 있으므로 이 방법은 작동하지 않습니다 .
필요한 결과를 얻는 가장 좋은 방법은 무엇입니까? Excel 수식이 있습니까? 아니면 VBA 코딩이 필요합니까?
답변1
이 방법을 시도해 볼 수 있습니다. 두 번째 열의 고유 항목 수집을 돕기 위해 사용자 정의 클래스를 사용합니다.
일반 모듈과 클래스 모듈의 코드는 기존 멤버와 동일한 키를 가진 컬렉션에 멤버를 추가하려고 하면 오류가 457
생성된다는 사실을 활용합니다.
소스(Src) 및 결과(Res)에 대한 워크시트 및 범위의 차이를 설명하기 위해 변경해야 하는 위치를 코드에서 확인할 수 있습니다.
클래스 모듈의 이름을 바꿔야 합니다 cConBy
. 당신 후 Insert Class Module
,F4속성창을 엽니다. Name
거기서 매개변수를 변경하세요 .
수업 모듈
Option Explicit
Private pConBy As String
Private pProd As String
Private pProds As Collection
Private Sub Class_Initialize()
Set pProds = New Collection
End Sub
Public Property Get ConBy() As String
ConBy = pConBy
End Property
Public Property Let ConBy(Value As String)
pConBy = Value
End Property
Public Property Get Prod() As String
Prod = pProd
End Property
Public Property Let Prod(Value As String)
pProd = Value
End Property
Public Function AddProd(Value As String)
On Error Resume Next
pProds.Add Value, CStr(Value)
On Error GoTo 0
End Function
Public Property Get Prods() As Collection
Set Prods = pProds
End Property
일반 모듈
Option Explicit
Sub UniqueConBy()
Dim cCB As cConBy, colCB As Collection
Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range
Dim vSrc As Variant, vRes() As Variant
Dim I As Long, J As Long, K As Long
Dim lRowCount As Long
'Source and results location
Set wsSrc = Worksheets("Sheet1")
Set wsRes = Worksheets("Sheet1")
Set rRes = wsRes.Cells(1, 5)
With wsSrc
vSrc = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(columnsize:=2)
End With
'Collect and consolidate the data
Set colCB = New Collection
On Error Resume Next
For I = 2 To UBound(vSrc, 1)
Set cCB = New cConBy
With cCB
.ConBy = vSrc(I, 1)
.Prod = vSrc(I, 2)
.AddProd .Prod
lRowCount = lRowCount + 1
colCB.Add cCB, CStr(.ConBy)
Select Case Err.Number
Case 457
With colCB(CStr(.ConBy))
lRowCount = lRowCount - .Prods.Count - 1
.AddProd cCB.Prod
lRowCount = lRowCount + .Prods.Count
End With
Err.Clear
Case Is <> 0
MsgBox "Error: " & Err.Number & vbTab & Err.Description
Stop
End Select
End With
Next I
On Error GoTo 0
'Create results array
ReDim vRes(0 To lRowCount, 1 To 2)
'column labels
For I = 1 To UBound(vRes, 2)
vRes(0, I) = vSrc(1, I)
Next I
'populate the array
For I = 1 To colCB.Count
With colCB(I)
K = K + 1
vRes(K, 1) = .ConBy
vRes(K, 2) = .Prods(1)
For J = 2 To .Prods.Count
K = K + 1
vRes(K, 2) = .Prods(J)
Next J
End With
Next I
Set rRes = rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2))
With rRes
.EntireColumn.Clear
.Value = vRes
With .Rows(1)
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With
.EntireColumn.AutoFit
End With
End Sub
편집하다:
원하는 것과 비슷하지만 약간 다른 출력을 제공하는 대체 방법은 간단히 데이터 리본/데이터 도구 탭에서 중복 항목 제거 옵션을 사용하는 것입니다. A열과 B열을 모두 선택합니다.
이 방법을 적용하기 전에 데이터가 정렬되었는지 확인하십시오. VBA 방법을 사용하면 정렬이 필요하지 않습니다.
게시된 데이터를 사용하면 결과는 다음과 같습니다.
조건부 서식을 사용하여 A열의 중복 항목을 제거할 수 있습니다. 예: =$A2=$A1 수식을 사용하고 텍스트 색상의 서식을 배경과 동일하게 지정합니다. Con.By 값은 여전히 존재하지만 표시되지는 않습니다.
답변2
이해하기 쉽지만 Ron의 답변만큼 자동화 친화적이지는 않을 것 같은 다음 레시피를 시도해 보세요.
Con.By
가 열 A에 있고 열 B에 있다고 가정하고Prod
다른 열(예: C)에 "_"와 같은 구분 기호를 사용하여 두 열을 연결합니다.=A2&"_"&B2
이는 다음과 같습니다=CONCATENATE(A2,"_",B2)
예제를 사용하면 출력은 다음
A_1
과 같습니다. C 열을Paste Values
D 열에만 복사합니다.D열을 강조 표시하고 리본 메뉴를 사용하여 를 선택합니다
Data -> Remove Duplicates
. D 열은 다음과 같습니다.A_1 A_2
데이터를 두 개의 별도 열로 다시 분할하려면 리본 메뉴를 사용하고 를 선택합니다
Data -> Text to Columns
. '구분됨'을 선택하세요.
답변3
이해하기 쉽지만 Ron의 답변만큼 자동화 친화적이지는 않을 것 같은 다음 레시피를 시도해 보세요.
Con.By
가 열 A에 있고 열 B에 있다고 가정하고Prod
다른 열(예: C)에 "_"와 같은 구분 기호를 사용하여 두 열을 연결합니다.=A2&"_"&B2
이는 다음과 같습니다=CONCATENATE(A2,"_",B2)
예제를 사용하면 출력은
A_1
다음과 같습니다. C 열을Paste Values
D 열에만 복사합니다.D열을 강조 표시하고 리본 메뉴를 사용하여 를 선택합니다
Data -> Remove Duplicates
. D 열은 다음과 같습니다.A_1 A_2
데이터를 두 개의 별도 열로 다시 분할하려면 리본 메뉴를 사용하고 를 선택합니다
Data -> Text to Columns
.Delimited
첫 번째 옵션을 선택하고 두 번째 옵션을 선택합니다Other
._
이 경우 구분 기호가 있습니다 .
이렇게 하면 원하는 것에 가까운 결과를 얻을 수 있습니다.