如何使用VBA对选中单元格区域的每一列单独进行升序排序
VBA逐列排序代码问题修复
核心错误点
- 给Range对象
Sortcol赋值时缺少Set关键字,VBA中对象赋值必须使用Set - 变量
HH仅获取了选区的行数,没有转换为实际的结束行号,导致排序区域计算错误 - 未显式声明所有变量,容易出现隐式类型错误,建议模块开头添加
Option Explicit强制变量声明 Range、Cells未绑定父工作表,跨工作表操作时容易出现作用域错误
修正后完整代码
Option Explicit Public Sub Sortrange() ' 对选中区域的每列单独按升序排序 Dim Rng As Range, Sortcol As Range Dim HH As Long, Srow As Long, SCol As Long, i As Long, A As Long, B As Long ' 校验是否选中单元格区域 If TypeName(Selection) <> "Range" Then MsgBox "请先选中需要排序的单元格区域", vbExclamation Exit Sub End If Set Rng = Selection HH = Rng.Rows.Count ' 选区行数 Srow = Rng(1).Row ' 选区起始行号 SCol = Rng(1).Column ' 选区起始列号 ' 逐列循环排序 For i = 1 To Rng.Columns.Count A = Srow B = SCol + i - 1 ' 绑定选区所在工作表避免作用域问题 Set Sortcol = Rng.Parent.Range(Rng.Parent.Cells(A, B), Rng.Parent.Cells(A + HH - 1, B)) ' 指定排序规则,Header参数设置为xlYes可跳过表头行排序 Sortcol.Sort Key1:=Sortcol.Cells(1, 1), Order1:=xlAscending, Header:=xlNo Next End Sub
注意事项
- 选中需要逐列排序的单元格区域后运行宏即可生效
- 如果数据第一行为表头,将代码中
Header:=xlNo修改为Header:=xlYes即可
内容的提问来源于stack exchange,提问作者David Leitch
相关产品推荐
相关产品推荐

