Excel数据表定制分组排序

实例需求:某学校体育活动统计表如下图左侧表格所示,数据按照班级排列,现在需要根据如下规格对表格进行排序

  • "幼儿"班级排列在表格最后
  • 按照"次数"降序排列
  • "幼儿"班级同样按"次数"降序排列

排序结果如下图中右侧表格所示。

示例代码如下。

vb 复制代码
Sub Demo1()
    Dim i As Long, lastRow As Long
    lastRow = Range("A1").End(xlDown).Row
    Const HELPER = 4
    For i = 2 To lastRow
        Cells(i, HELPER) = IIf(Left(Cells(i, 1), 2) = "幼儿", 0, 1)
    Next
    With Range("A1").CurrentRegion
        .Sort key1:=.Columns(HELPER), order1:=xlDescending, _
            key2:=.Columns(HELPER - 1), order2:=xlDescending, Header:=xlYes
    End With
    Columns(HELPER).Clear
End Sub

【代码解析】

第3行代码获取数据总行数。

第4行代码定义辅助列的位置。

第5~7行代码根据班级填充辅助列,"幼儿"班级填充0,其他班级填充1,根据辅助列降序排列,"幼儿"班级将移至最后。

第8~11行代码对数据表排序,辅助列为第一关键列,"次数"为第二关键列,两列都使用降序排列。

第12行代码清空辅助列。

使用VBA进行排序,通常思路是将数据表读取到数组中,然后使用排序算法进行排序(例如:冒泡法),由于Excel已经提供了强大的排序功能,通过构建辅助列可以更高效地实现排序。


如果限于工作表布局,无法使用辅助列(例如:D列有其他数据,也无法使用插入新列),这里提供一种变通实现方式。

vb 复制代码
Sub Demo2()
    Dim i As Long, lastRow As Long
    Const I_OFFSET = -9999
    lastRow = Range("A1").End(xlDown).Row
    For i = 2 To lastRow
        If Left(Cells(i, 1), 2) = "幼儿" Then Cells(i, 3) = Cells(i, 3) + I_OFFSET
    Next
    With Range("A1").CurrentRegion
        .Sort key1:=.Columns(3), order1:=xlDescending, Header:=xlYes
    End With
    For i = 2 To lastRow
        If Left(Cells(i, 1), 2) = "幼儿" Then Cells(i, 3) = Cells(i, 3) - I_OFFSET
    Next
End Sub

【代码解析】

第5~7行代码根据班级修改"次数"列,如果班级包含"幼儿",则将次数减去一个足够大的数

第8~10行代码对数据表按"次数"列降序排列,"幼儿"班级将被排列在最后。

第12行代码恢复"次数"列的原始数据。

相关推荐
闻缺陷则喜何志丹5 天前
【C++前缀和 排序】891. 子序列宽度之和|2182
c++·算法·前缀和·力扣·排序·子序列·宽度
源代码•宸8 天前
Leetcode—252. 会议室【简单】Plus
c++·经验分享·算法·leetcode·排序
轩情吖15 天前
二叉树-堆(补充)
c语言·数据结构·c++·后端·二叉树··排序
L_M_TY18 天前
E. Correct Placement
算法·贪心·排序·双指针
m0_6759882322 天前
Leetcode40: 组合总和 II
算法·leetcode·回溯·排序·python3
A懿轩A1 个月前
C/C++ 数据结构与算法【排序】 常见7大排序详细解析【日常学习,考研必备】带图+详细代码
c语言·c++·学习·排序算法·排序
金创想1 个月前
排序的本质、数据类型及算法选择
排序
BabyFish132 个月前
hive中的四种排序类型
数据仓库·hive·hadoop·排序·order by·sorted
KevinRay_2 个月前
Numpy指南:解锁Python多维数组与矩阵运算(下)
python·矩阵·numpy·排序·文件读写
五月高高2 个月前
Lambda表达式对List对象实现多个动态属性排序
java·排序