如何在Excel VBA中对已分组的团队数据按Sum列升序二次排序?
实现团队自定义排序+组内Sum列升序的VBA代码修改
已有A-D四列数据,已通过VBA完成C列(Team)按「Team 1→Team 2→Team 3→Team 4→Team 5」的自定义顺序排序,现需在每个团队分组内,进一步按D列(Sum)做升序排序。
数据示例
A1 Name C1 Team D1 Sum A2 Bob C2 Team 1 D2 32 A3 Tom C3 Team 1 D3 79 A4 Shel C4 Team 1 D4 15 A5 Lin C5 Team 1 D5 58 A6 LEE C6 Team 2 D6 61 A7 Mir C7 Team 2 D7 13 A8 Fin C8 Team 2 D8 46 A9 Vin C9 Team 3 D9 92 A10 Kris C10 Team 3 D10 129
原排序代码
ovv.Sort.SortFields.Clear ovv.Sort.SortFields.Add Key:=Range("B2:B" & LastRow2), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="Team 1, Team 2, Team 3, Team 4, Team 5", DataOption:=xlSortNormal With ovv.Sort .SetRange Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, Cells(1, Columns.Count).End(xlToLeft).Column)) .Header = xlYes .Apply End With
修改方案
只需在原代码的排序字段中新增一个Sum列的排序条件,注意排序字段的先后顺序:先按Team的自定义规则排序,再按Sum列升序排序,即可实现组内排序效果。
修改后的完整代码
ovv.Sort.SortFields.Clear ' 1. 第一排序条件:Team列自定义顺序(修正原代码列索引错误,Team列实际为C列) ovv.Sort.SortFields.Add Key:=Range("C2:C" & LastRow2), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="Team 1, Team 2, Team 3, Team 4, Team 5", DataOption:=xlSortNormal ' 2. 第二排序条件:Sum列升序 ovv.Sort.SortFields.Add Key:=Range("D2:D" & LastRow2), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ovv.Sort .SetRange Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, Cells(1, Columns.Count).End(xlToLeft).Column)) .Header = xlYes .Apply End With
关键说明
- 修正原代码中Team列的索引错误:原代码写的是
Range("B2:B" & LastRow2),但根据数据示例Team列是C列,同步调整为Range("C2:C" & LastRow2)。 - 排序字段的添加顺序决定优先级:先执行Team的自定义分组排序,再在每个Team分组内执行Sum列的升序排序。
- 保持
.SetRange和.Header的设置不变,确保整个数据区域被正确覆盖排序。
内容的提问来源于stack exchange,提问作者Kellogs
相关产品推荐
相关产品推荐

