
그룹과 구성원 테이블이 포함된 Excel 스프레드시트가 있습니다. 예를 들어:
A Jonathan
A Roger
A Donald
B John
B Lilya
C Richard
C Lorry
제가 하고 싶은 것은 그룹당 구성원 수를 60% 정도 줄이는 것입니다. 멤버 중 누가 빠져도 상관없습니다. 예를 들어 그룹 B에는 2명의 멤버가 있으므로 1명의 멤버를 제거하고 싶습니다(2*0.6=1.2이므로 아래로 반올림해야 하며, 0.5보다 크면 위로 반올림하고 싶습니다).
Excel 수식으로 작업할 수 있나요?
답변1
@EngineerToast가 보여준 것과 같은 피벗 테이블은 이를 수행하는 훨씬 간단한 방법입니다. 하지만 저는 터무니없이 과도하게 엔지니어링된 훌륭한 솔루션을 좋아하므로 VBA에서 이를 수행하는 한 가지 방법이 있습니다. 나는 사전을 사용하여 그것을 너무 복잡하게 만들었다는 의심이 듭니다. 아마도 다른 빠른 계산을 사용하고 이미 사용된 문자를 배열에 추가했을 수도 있지만, 여기까지입니다..!
Public Sub ReduceMembers()
Dim GroupColumn: GroupColumn = 1 'Original column containing your Groups
Dim MemberColumn: MemberColumn = 2 'Original column containing your Members
Dim ReductionAmount: ReductionAmount = 0.6 'Percentage as a decimal fraction
Range("D1").Select 'Start cell for your new columns
Dim LastRow: LastRow = GetLastRow(GroupColumn)
Dim Dictionary, DictionaryKey, I
Set Dictionary = CreateObject("Scripting.Dictionary")
For I = 1 To LastRow
Dim Value: Value = Cells(I, GroupColumn).Value
If Dictionary.Exists(Value) Then
Dictionary(Value) = Dictionary(Value) + 1
Else
Dictionary.Add Value, 1
End If
Next
For Each DictionaryKey In Dictionary.Keys
Dim MaxAmount: MaxAmount = Math.Round(Dictionary(DictionaryKey) * ReductionAmount, 0)
Dim CurrentAmount: CurrentAmount = 0
For I = 1 To LastRow
If Cells(I, GroupColumn) = DictionaryKey Then
If CurrentAmount >= MaxAmount Then
Exit For
End If
ActiveCell.Value = DictionaryKey
ActiveCell.Offset(0, 1).Value = Cells(I, MemberColumn).Value
ActiveCell.Offset(1, 0).Select
CurrentAmount = CurrentAmount + 1
End If
Next
Next
End Sub
Function GetLastRow(GroupColumn)
Dim Count
Count = 0
Do
Count = Count + 1
Loop Until IsEmpty(Cells(Count, GroupColumn).Value)
GetLastRow = Count - 1
End Function
답변2
일회성 작업의 경우 피벗 테이블을 사용하여 수행할 수 있습니다. 자주 수행해야 하는 경우 이 접근 방식이 어색해질 수 있습니다.
먼저 열 제목을 추가합니다. 나는 Group
및 Name
. 목록에서 셀을 선택하고 삽입 리본(맨 왼쪽 버튼)에서 "피벗 테이블"을 클릭합니다.
그것~해야 한다피벗 테이블을 적용하려는 범위를 자동으로 추측합니다. 피벗 테이블을 새 시트에 추가하려면 "확인"을 클릭하기만 하면 됩니다. 그런 Group
다음 필드를 Name
필드 목록에서 행 목록으로 끌어서 테이블의 행 부분에 추가합니다. 드래그도 해야 합니다무엇값 부분에 추가하지 않으면 상위 비율을 필터링할 수 없습니다.
피벗 테이블의 이름 중 하나를 마우스 오른쪽 버튼으로 클릭한 다음 필터 > 상위 10...을 클릭합니다.
필터를 원하는 대로 설정하고 확인을 클릭하세요.
원본 데이터와 더 비슷하게 만들려면 테이블을 마우스 오른쪽 버튼으로 클릭하고 피벗 테이블 옵션으로 이동한 다음 표시 탭으로 이동하여 "클래식 피벗 테이블 레이아웃"을 선택하세요. 그런 다음 피벗 테이블의 그룹 중 하나를 마우스 오른쪽 버튼으로 클릭하고 필드 설정을 클릭합니다. 소계를 없음으로 설정하고 레이아웃 및 인쇄 탭에서 "항목 레이블 반복"을 선택하십시오.