普通版
Sub 调整列的顺序()
Dim r%, i%
With Worksheets("sheet2")
r = .Cells(.Rows.Count, 1).End(xlUp).Row '最后一行行号
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("A1:F1"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="工作组,性别,姓名,年龄,地址", DataOption:=xlSortNormal
With .Sort
.SetRange Range("A1:F" & r)
.Header = xlYes
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
End With
End Sub
调整前 VS 调整后
特点:
- 未设置顺序的列放到最后
不足:
- 默认的标题行是第一行
- 引用的区域是字母,固定的
- 没有考虑数据区域第一行不是标题行
加强版
为了克服普通的缺点
难点:Order:=xlAscending, CustomOrder:=“工作组,性别,姓名,年龄,地址”, DataOption:=
当我用变量替换红色字符时,报错类型错误13
解决:当用变量赋值时应这样:sort_str = “””工作组“”,””性别“”,””姓名“”,””年龄“”,””地址“””,经测试还是不行!
原因:该变量不是普通字符串,是Long类型,是自定义排序列表,在VBA如何自定义排序列表?👇👉【VBA】自定义排序列表,排序 ```vbnet Sub 调整列的顺序2(sheet, titlerow) Dim r%, i% Dim start_c, start_r, end_c, end_r Dim title_range, data_range Dim sort_str As String sort_str = “””工作组””,””性别””,””姓名””,””年龄””,””地址””” With sheet start_r = .UsedRange.Row + tilterow + 1 end_r = .UsedRange.Row + .UsedRange.Rows.Count - 1 ‘最后一行行号 start_c = Split(.Cells(1, .UsedRange.Column).Address(True, False), “$”)(0) end_c = Split(.Cells(1, .UsedRange.Column + .UsedRange.Columns.Count - 1).Address(True, False), “$”)(0) title_range = start_c & start_r & “:” & end_c & start_r data_range = start_c & start_r & “:” & end_c & end_r
Debug.Print "标题行:" & title_range
Debug.Print "数据区域:" & data_range
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range(title_range), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=列序, DataOption:=xlSortNormal
With .Sort
.SetRange Range(data_range)
.Header = xlYes
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
End With End Sub
Sub test() Dim sheet As Worksheet Set sheet = Worksheets(“sheet2”)
Call 调整列的顺序2(sheet, 1) End Sub ```