Excel VBA 双列排序
功能概述
这段VBA代码实现了Excel中的双列排序功能,具体是:
- 跳过前3行表头
- 先按C列数据从大到小排序
- 在C列值相同的情况下,按B列从大到小排序
- 排序时保持整行数据的完整性
流程图
代码详解
1. 变量声明和初始化
Dim ws As Worksheet
Dim lastRow As Long
Dim sortRange As RangeSet 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 WorksheetDim lastRow As LongDim sortRange As RangeSet ws = ActiveSheetlastRow = 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.ApplyEnd WithMsgBox "排序完成!"
End Sub
V20250116 每行的X从小到大升序排列
Sub SortTwoColumnsWithHeaders()Dim ws As WorksheetDim lastRow As LongDim sortRange As RangeSet ws = ActiveSheetlastRow = 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.ApplyEnd WithMsgBox "points order finshied!"
End Sub