【Excel】【VBA】双列排序:坐标从Y从大到小排列之后相同Y坐标的行再对X从小到大排列
Excel VBA 双列排序
功能概述
这段VBA代码实现了Excel中的双列排序功能,具体是:
- 跳过前3行表头
- 先按C列数据从大到小排序
- 在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
: 使用拼音排序方法
使用注意事项
- 确保数据从第4行开始
- 数据列需要在A到E列之间
- 数据格式应为数字类型
- 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