【Excel】【VBA】双列排序:坐标从Y从大到小排列之后相同Y坐标的行再对X从小到大排列

发布于:2025-02-10 ⋅ 阅读:(27) ⋅ 点赞:(0)

Excel VBA 双列排序

在这里插入图片描述

功能概述

这段VBA代码实现了Excel中的双列排序功能,具体是:

  1. 跳过前3行表头
  2. 先按C列数据从大到小排序
  3. 在C列值相同的情况下,按B列从大到小排序
  4. 排序时保持整行数据的完整性

流程图

开始
定义工作表和变量
获取最后一行行号
设置数据格式
定义排序范围
清除已有排序字段
添加第一个排序键:C列
添加第二个排序键:B列
执行排序
显示完成提示
结束

代码详解

1. 变量声明和初始化

Dim ws As Worksheet
Dim lastRow As Long
Dim sortRange As Range
    
Set ws = ActiveSheet
  • Worksheet: 工作表对象
  • lastRow: 存储数据的最后一行行号
  • sortRange: 定义排序范围

2. 获取数据范围

lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
  • 使用End(xlUp)方法从底部向上查找最后一个非空单元格

3. 格式设置

With ws.Range("B4:C" & lastRow)
    .NumberFormat = "0.00"    '设置为2位小数
    .Value = .Value           '刷新值
End With
  • 设置B列和C列的数字格式
  • 通过重新赋值来刷新单元格内容

4. 排序范围定义

Set sortRange = ws.Range("A4:E" & lastRow)
  • 从第4行开始(跳过表头)
  • 包含A到E列的所有数据

5. 排序实现

With ws.Sort
    .SortFields.Clear
    .SortFields.Add Key:=ws.Range("C4:C" & lastRow), _
        SortOn:=xlSortOnValues, _
        Order:=xlDescending, _
        DataOption:=xlSortNormal
    .SortFields.Add Key:=ws.Range("B4:B" & lastRow), _
        SortOn:=xlSortOnValues, _
        Order:=xlDescending, _
        DataOption:=xlSortNormal
    .SetRange sortRange
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

关键参数说明:

  • SortFields.Clear: 清除现有排序条件
  • SortOn:=xlSortOnValues: 按值排序
  • Order:=xlDescending: 降序排列
  • Header = xlNo: 不包含表头
  • SortMethod = xlPinYin: 使用拼音排序方法

使用注意事项

  1. 确保数据从第4行开始
  2. 数据列需要在A到E列之间
  3. 数据格式应为数字类型
  4. C列为第一排序键,B列为第二排序键

V20250116 X从大到小

Sub SortTwoColumnsWithHeaders()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim sortRange As Range
    
    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
    
    '确保数据格式正确(从第4行开始)
    With ws.Range("B4:C" & lastRow)
        .NumberFormat = "0.00"    '设置为5位小数
        .Value = .Value              '刷新值
    End With
    
    '定义排序范围(从A列到E列,从第4行开始)
    Set sortRange = ws.Range("A4:E" & lastRow)
    
    '执行排序
    With ws.Sort
        .SortFields.Clear
        .SortFields.Add Key:=ws.Range("C4:C" & lastRow), _
            SortOn:=xlSortOnValues, _
            Order:=xlDescending, _
            DataOption:=xlSortNormal
        .SortFields.Add Key:=ws.Range("B4:B" & lastRow), _
            SortOn:=xlSortOnValues, _
            Order:=xlDescending, _
            DataOption:=xlSortNormal
        .SetRange sortRange
        .Header = xlNo               '因为真正的数据从第4行开始,所以这里设置为No
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    MsgBox "排序完成!"
End Sub


V20250116 每行的X从小到大升序排列

Sub SortTwoColumnsWithHeaders()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim sortRange As Range
    
    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
    
    '确保数据格式正确(从第4行开始)
    With ws.Range("B4:C" & lastRow)
        .NumberFormat = "0.00"    '设置为5位小数
        .Value = .Value              '刷新值
    End With
    
    '定义排序范围(从A列到E列,从第4行开始)
    Set sortRange = ws.Range("A4:E" & lastRow)
    
    '执行排序
    With ws.Sort
        .SortFields.Clear
        .SortFields.Add Key:=ws.Range("C4:C" & lastRow), _
            SortOn:=xlSortOnValues, _
            Order:=xlDescending, _
            DataOption:=xlSortNormal
        .SortFields.Add Key:=ws.Range("B4:B" & lastRow), _
            SortOn:=xlSortOnValues, _
            Order:=xlAscending, _
            DataOption:=xlSortNormal
        .SetRange sortRange
        .Header = xlNo               '因为真正的数据从第4行开始,所以这里设置为No
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    MsgBox "points order finshied!"
End Sub



网站公告

今日签到

点亮在社区的每一天
去签到