【发布时间】:2018-05-24 15:22:43
【问题描述】:
通过简化示例,假设您有以下数据集:
A B C
Name Group Amount
Dave A 2
Mike B 3
Adam C 4
Charlie A 2
Edward B 5
Fiona B 5
Georgie A 4
Harry C 1
Mary A 0
Delia A 0
Victor B 1
Dennis B 0
Erica A 4
Will B 4
我正在尝试从每个组中提取最高的“x”条目(在此示例中假设为 2)。
例如,A 组中最高的两个条目是 Georgie 和 Erica,分别为 4。然后我还想要 B 组和 C 组的最高两个条目。
我希望 VBA 代码提取这些行并将它们粘贴到另一个工作表中以供后续分析。
到目前为止,我已经尝试过这样的代码:
ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _
("C1"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveSheet.Range("$A$1:$C$15").AutoFilter Field:=2, Criteria1:="A"
Range("A5:C6").Select
Selection.Copy
Sheets("Sheet2").Select
Range("A2").Select
ActiveSheet.Paste
Sheets("Sheet1").Select
ActiveSheet.Range("$A$1:$C$15").AutoFilter Field:=2, Criteria1:="B"
Range("A2:C3").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet2").Select
Range("E2").Select
ActiveSheet.Paste
Sheets("Sheet1").Select
ActiveSheet.Range("$A$1:$C$15").AutoFilter Field:=2, Criteria1:="C"
Range("A4:C11").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet2").Select
Range("I2").Select
ActiveSheet.Paste
简而言之,我只是将值从最大到最小排序,然后对每个组进行过滤,并提取前两个值。但是,代码没有弹性,因为复制部分取决于名称的特定顺序,当我获得新数据时,它会改变。
有没有更聪明、更简洁的方法?
【问题讨论】:
-
您可以设置复制的动态范围。查找如何找到最后一行。编辑:聪明的可能正在使用索引/匹配/最大值的某种组合。