我有一个 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 名...”
将过滤器设置为您想要的任何值,然后单击“确定”。
为了使其看起来更像原始数据,请右键单击表格,转到“数据透视表选项”,然后转到“显示”选项卡并选中“经典数据透视表布局”。接下来,右键单击数据透视表中的其中一个组,然后单击“字段设置”。将“小计”设置为“无”,然后在“布局和打印”选项卡上选中“重复项目标签”。