在一個群組和成員表中,如何減少每個群組的一定比例的成員?

在一個群組和成員表中,如何減少每個群組的一定比例的成員?

我有一個 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

相關內容