그룹 및 구성원 테이블에서 그룹당 특정 비율의 구성원을 줄이는 방법은 무엇입니까?

그룹 및 구성원 테이블에서 그룹당 특정 비율의 구성원을 줄이는 방법은 무엇입니까?

그룹과 구성원 테이블이 포함된 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

일회성 작업의 경우 피벗 테이블을 사용하여 수행할 수 있습니다. 자주 수행해야 하는 경우 이 접근 방식이 어색해질 수 있습니다.

최종 스크린샷

먼저 열 제목을 추가합니다. 나는 GroupName. 목록에서 셀을 선택하고 삽입 리본(맨 왼쪽 버튼)에서 "피벗 테이블"을 클릭합니다.

2 단계

그것~해야 한다피벗 테이블을 적용하려는 범위를 자동으로 추측합니다. 피벗 테이블을 새 시트에 추가하려면 "확인"을 클릭하기만 하면 됩니다. 그런 Group다음 필드를 Name필드 목록에서 행 목록으로 끌어서 테이블의 행 부분에 추가합니다. 드래그도 해야 합니다무엇값 부분에 추가하지 않으면 상위 비율을 필터링할 수 없습니다.

3단계

피벗 테이블의 이름 중 하나를 마우스 오른쪽 버튼으로 클릭한 다음 필터 > 상위 10...을 클릭합니다.

4단계

필터를 원하는 대로 설정하고 확인을 클릭하세요.

5단계

원본 데이터와 더 비슷하게 만들려면 테이블을 마우스 오른쪽 버튼으로 클릭하고 피벗 테이블 옵션으로 이동한 다음 표시 탭으로 이동하여 "클래식 피벗 테이블 레이아웃"을 선택하세요. 그런 다음 피벗 테이블의 그룹 중 하나를 마우스 오른쪽 버튼으로 클릭하고 필드 설정을 클릭합니다. 소계를 없음으로 설정하고 레이아웃 및 인쇄 탭에서 "항목 레이블 반복"을 선택하십시오.

6단계

관련 정보