在群组和成员表中,如何减少每个群组的一定百分比的成员?

在群组和成员表中,如何减少每个群组的一定百分比的成员?

我有一个 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 步

相关内容