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行代码恢复"次数"列的原始数据。

相关推荐
起个破名想半天了1 天前
算法与数据结构之排序
数据结构·排序算法·排序·算法与数据结构
问好眼9 天前
《算法竞赛进阶指南》0x05 排序-1.电影
c++·算法·排序·信息学奥赛
汉克老师14 天前
GESP2026年3月认证C++五级( 第三部分编程题(2)找数)
c++·排序·双指针·二分算法·gesp5级·gesp五级
伟大的车尔尼15 天前
双指针题目:满足条件的子序列数目
二分查找·排序·双指针
AKA__Zas1 个月前
初识基本排序
java·数据结构·学习方法·排序
元亓亓亓2 个月前
考研408--数据结构--day15--排序&内部排序(上)
数据结构·408·排序·内部排序
闻缺陷则喜何志丹2 个月前
【前后缀分解 排序】B4274 [蓝桥杯青少年组省赛 2023] 数字游戏|普及+
c++·蓝桥杯·排序·洛谷·前后缀分解
知无不研2 个月前
冒泡排序算法
算法·冒泡排序·排序
Tisfy2 个月前
LeetCode 3010.将数组分成最小总代价的子数组 I:排序 OR 维护最小次小
算法·leetcode·题解·排序·最小次小值
码农幻想梦2 个月前
PKUKY109 小白鼠排队
排序