普通版

  1. Sub 调整列的顺序()
  2. Dim r%, i%
  3. With Worksheets("sheet2")
  4. r = .Cells(.Rows.Count, 1).End(xlUp).Row '最后一行行号
  5. .Sort.SortFields.Clear
  6. .Sort.SortFields.Add Key:=.Range("A1:F1"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="工作组,性别,姓名,年龄,地址", DataOption:=xlSortNormal
  7. With .Sort
  8. .SetRange Range("A1:F" & r)
  9. .Header = xlYes
  10. .MatchCase = False
  11. .Orientation = xlLeftToRight
  12. .SortMethod = xlPinYin
  13. .Apply
  14. End With
  15. End With
  16. End Sub

调整前 VS 调整后
image.png
特点:

  • 未设置顺序的列放到最后

不足:

  • 默认的标题行是第一行
  • 引用的区域是字母,固定的
  • 没有考虑数据区域第一行不是标题行

    加强版

    为了克服普通的缺点
    难点: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
  1. Debug.Print "标题行:" & title_range
  2. Debug.Print "数据区域:" & data_range
  3. .Sort.SortFields.Clear
  4. .Sort.SortFields.Add Key:=.Range(title_range), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=列序, DataOption:=xlSortNormal
  5. With .Sort
  6. .SetRange Range(data_range)
  7. .Header = xlYes
  8. .MatchCase = False
  9. .Orientation = xlLeftToRight
  10. .SortMethod = xlPinYin
  11. .Apply
  12. End With

End With End Sub

Sub test() Dim sheet As Worksheet Set sheet = Worksheets(“sheet2”)

Call 调整列的顺序2(sheet, 1) End Sub ```