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

相关推荐
会飞的小菠菜3 天前
如何根据Excel数据表生成多个合同、工作证、录取通知书等word文件?
word·excel·模板·数据表·生成文件
梁辰兴3 天前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
Tisfy4 天前
LeetCode 3027.人员站位的方案数 II:简单一个排序O(n^2)——ASCII图解
leetcode·题解·思维·排序·hard
hzhzh~1 个月前
【C++】神秘-希尔排序
c++·希尔排序·排序·sort
Alfred king1 个月前
Leetcode 四数之和
算法·leetcode·职场和发展·数组·排序·双指针
junjunyi1 个月前
【LeetCode 148】算法进阶:排序链表 ( 归并排序、快速排序、计数排序 )
链表·排序·分治·归并
Alfred king1 个月前
面试150 IPO
面试·职场和发展·贪心·数组··排序
今天背单词了吗9802 个月前
算法学习笔记:29.拓扑排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·笔记·算法·拓扑排序·排序
NuyoahC2 个月前
HOT100——排序篇Leetcode215. 数组中的第K个最大元素
c++·leetcode·排序算法·排序
初级代码游戏2 个月前
WinUI3入门16:Order自定义排序
自定义·排序·order·winui3