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


-1

그룹 및 멤버 테이블이 포함 된 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 수식으로 할 수 있습니까?


나는 당신의 모범을 일관되게 만들었지 만, 당신의 말이 당신이 원하는 것을 올바르게 묘사하고 있는지 확실하지 않습니다. 축소 를 60 %로 하시겠습니까, 아니면 원본의 60 %로 줄이려고합니까 (40 % 감소)? 예제의 수학 오류 외에도 반올림을 올바른 값에 적용해야합니다. 감소량을 반올림하여 나머지 값에 역효과를줍니다. 당신이 감소에 대해 이야기하는 경우 원래의 60 %, 당신은 나머지 숫자보다는 감소 금액을 기준으로 라운드 할 필요가있다.
fixer1234

답변:


0

@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

여기에 이미지 설명을 입력하십시오


문제의 표현은 모호하지만,이 감소 제공 오히려 감소보다 원래의 60 % 60 %.
fixer1234

0

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

최종 스크린 샷

먼저 열 머리글을 추가하십시오. 내가 사용 Group하고 Name. 목록에서 셀을 선택하고 삽입 리본 (맨 왼쪽 단추)에서 "피벗 테이블"을 클릭하십시오.

2 단계

그것은 해야 자동으로 피벗 테이블을 적용 할 수있는 범위를 생각한다. 피벗 테이블을 새 시트에 추가하려면 "확인"을 클릭하면됩니다. 다음에 필드를 추가 Group한 다음과 Name행] 목록으로 필드리스트로부터 드래그하여 테이블의 행 부로. 또한 값 부분으로 무언가 를 드래그해야합니다. 그렇지 않으면 상위 백분율을 필터링 할 수 없습니다.

3 단계

피벗 테이블에서 이름 중 하나를 마우스 오른쪽 버튼으로 클릭하고 필터> 상위 10 ...을 클릭하십시오.

4 단계

필터를 원하는대로 설정하고 확인을 클릭하십시오.

5 단계

원본 데이터처럼 보이게하려면 표를 마우스 오른쪽 단추로 클릭하고 피벗 테이블 옵션으로 이동 한 다음 표시 탭으로 이동하여 "클래식 피벗 테이블 레이아웃"을 확인하십시오. 다음으로 피벗 테이블에서 그룹 중 하나를 마우스 오른쪽 단추로 클릭하고 필드 설정을 클릭하십시오. 소계를 없음으로 설정하고 레이아웃 및 인쇄 탭에서 "항목 레이블 반복"을 선택하십시오.

6 단계


문제의 표현은 모호하지만,이 감소 제공 오히려 감소보다 원래의 60 % 60 %.
fixer1234

@ fixer1234 기술적으로 정확합니다 . 수정되었습니다.
엔지니어 토스트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.