
我有一個 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 個...”
將過濾器設定為您想要的任何內容,然後按一下「確定」。
要使其看起來更像原始數據,請右鍵單擊表格,轉到數據透視表選項,然後轉到顯示選項卡並選中“經典數據透視表佈局”。接下來,右鍵單擊資料透視表中的群組之一,然後按一下「欄位設定」。將“小計”設為“無”,然後在“佈局和列印”標籤上選取“重複項目標籤”。