Excel多列动态自定义排序VBA代码优化咨询
动态适配数据行数的VBA排序代码
你的现有代码依赖固定行数30533,当数据行数超过这个值时,超出部分不会被纳入排序范围。以下是修改后的代码,可自动识别工作表中的有效数据范围,适配任意行数的变化:
Sub Rx_Custom_Sort_1() Dim ws As Worksheet Dim lastRow As Long ' 赋值目标工作表,避免重复调用 Set ws = ActiveWorkbook.Worksheets("Prescriptions_Clean_2b") ' 获取有效数据的最后一行(以A列为准,若A列有空行可替换为D/G等非空列) lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 清空原有排序规则 ws.Sort.SortFields.Clear ' 添加排序规则:按D、E、F、G列升序 ws.Sort.SortFields.Add2 Key:=ws.Range("D2:D" & lastRow), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ws.Sort.SortFields.Add2 Key:=ws.Range("E2:E" & lastRow), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ws.Sort.SortFields.Add2 Key:=ws.Range("F2:F" & lastRow), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ws.Sort.SortFields.Add2 Key:=ws.Range("G2:G" & lastRow), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ' 应用排序到整个数据区域(A1到N列最后一行) With ws.Sort .SetRange ws.Range("A1:N" & lastRow) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
关键修改说明
- 用
lastRow变量动态获取有效数据的最后一行:通过Cells(Rows.Count, "A").End(xlUp).Row从A列底部向上查找第一个非空单元格,得到最后一行行号 - 将所有固定的
30533替换为lastRow,确保排序范围覆盖全部有效数据 - 把工作表赋值给
ws变量,减少重复代码调用,提升代码可读性和执行效率
注意事项
如果数据区域的A列存在空行,可将获取lastRow时的列参数("A")替换为D、E、F、G中任意一列(这些列是排序依据,肯定不会有空行),比如:
lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
内容的提问来源于stack exchange,提问作者Rach Cohen
相关产品推荐
相关产品推荐

