使用 Range 对象的 Sort 方法或者 Worksheet 对象的 Sort 方法都可以对单元格区域或工作表中的数据进行排序。
Range.Sort 方法
语法
Range.Sort (Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)
参数
名称 | 必需/可选 | 数据类型 | 说明 |
---|---|---|---|
Key1 | 可选 | Variant | 第一个排序字段,作为区域名称(String)或 Range 对象;确定要排序的值。 |
Order1 | 可选 | XlSortOrder | 确定 Key1 指定值的排序顺序。升序为 xlAscending (默认值),降序为 xlDescending 。 |
Key2 | 可选 | Variant | 第二个排序字段;对数据透视表进行排序时无法使用。 |
Type | 可选 | Variant | 指定要在数据透视表中对哪种类型的元素进行排序。指定 xLSortLabels 以按数据透视表区域的行/列标签区域中的扩展范围所针对的标签排序;当 Key1 使用 R1 表示法另外以值或子/总计区域中的单元格为目标时,指定 xLSortValues 。 |
Order2 | 可选 | XlSortOrder | 确定 Key2 指定的值的排序顺序。 |
Key3 | 可选 | Variant | 第三个排序字段;对数据透视表进行排序时无法使用。 |
Order3 | 可选 | XlSortOrder | 确定 Key3 中指定值的排序顺序。 |
Header | 可选 | XlYesNoGuess | 指定第一行是否包含标题信息。默认值为 xlNo 。如果希望 Excel 确定标题,指定 xlGuess 。 |
OrderCustom | 可选 | Variant | 指定在自定义排序次序列表中的基于一的整数偏移。 |
MatchCase | 可选 | Variant | 设置为 True 可执行区分大小写的排序;设置为 False 可执行不区分大小写的排序;不能与数据透视表一起使用。 |
Orientation | 可选 | XlSortOrientation | 指定是应按行(默认)还是按列进行排序。将 xlSortColumns 值设置为 1 以按列排序。 将 xlSortRows 值设置为 2 以按行排序(默认值)。 |
SortMethod | 可选 | XlSortMethod | 指定排序方法。按汉语拼音顺序排序为 xlPinYin (默认值),按笔划数排序为 xlStroke 。 |
DataOption1 | 可选 | XlSortDataOption | 指定如何在 Key1 中指定的范围内对文本进行排序;不适用于数据透视表排序。 |
DataOption2 | 可选 | XlSortDataOption | 指定如何在 Key2 中指定的范围内对文本进行排序;不适用于数据透视表排序。 |
DataOption3 | 可选 | XlSortDataOption | 指定如何在 Key3 中指定的范围内对文本进行排序;不适用于数据透视表排序。 |
返回值
Variant
示例一:不大于三个关键字排序
以下示例按“总分”“语文”和“数学”的成绩降序排序:
Sub SortDemo1()
' 按“总分”“语文”和“数学”的成绩降序排序
Range("A1").Sort Key1:="总分", order1:=xlDescending, _
Key2:="语文", order2:=xlDescending, _
key3:="数学", order3:=xlDescending, _
Header:=xlYes
End Sub
示例二:大于三个关键字排序
使用 Range 对象的 Sort 方法对区域进行排序时,同时最多只能指定 3 个关键字,当超过 3 个关键字时,可以通过多次执行 Sort 方法来实现。需要注意的是,在排序时应按照各关键字的倒序顺序。例如,如果希望按 A→B→C→D 的关键字顺序进行排序,则应按 D→C→B→A 的顺序依次执行 Sort 方法。
以下示例按“总分”“语文”“数学”“物理”“化学”的成绩降序排序:
Sub SortDemo2()
' 按“总分”“语文”“数学”“物理”“化学”的成绩降序排序
With Range("A1")
.Sort Key1:="化学", order1:=xlDescending, Header:=xlYes
.Sort Key1:="物理", order1:=xlDescending, Header:=xlYes
.Sort Key1:="数学", order1:=xlDescending, Header:=xlYes
.Sort Key1:="语文", order1:=xlDescending, Header:=xlYes
.Sort Key1:="总分", order1:=xlDescending, Header:=xlYes
End With
End Sub
为了减少排序动作的次数,应尽可能多地在每一次排序中指定多个关键字,上述过程可以修改为如下示例代码,注意关键字的顺序:
Sub SortDemo3()
' 按“总分”“语文”“数学”“物理”“化学”的成绩降序排序
With Range("A1")
.Sort Key1:="物理", order1:=xlDescending, _
Key2:="化学", order2:=xlDescending, Header:=xlYes
.Sort Key1:="总分", order1:=xlDescending, _
Key2:="语文", order2:=xlDescending, _
Key3:="数学", order3:=xlDescending, Header:=xlYes
End With
End Sub
Worksheet 对象的 Sort 方法
使用 Range 对象的 Sort 方法对区域进行超过 3 个关键字排序时,需要多次执行 Sort 方法,而通过 Worksheet 对象的 Sort 方法则可以一次完成。
如下示例代码实现与 SortDemo2
过程相同的排序效果:
Sub MultipleKeySort()
With ActiveSheet.Sort.SortFields
' 清除活动工作表所有的排序字段
.Clear
' Add方法添加新的排序字段
.Add Key:=Range("F1"), SortOn:=xlSortOnValues, Order:=xlDescending
.Add Key:=Range("B1"), SortOn:=xlSortOnValues, Order:=xlDescending
.Add Key:=Range("C1"), SortOn:=xlSortOnValues, Order:=xlDescending
.Add Key:=Range("D1"), SortOn:=xlSortOnValues, Order:=xlDescending
.Add Key:=Range("E1"), SortOn:=xlSortOnValues, Order:=xlDescending
End With
With ActiveSheet.Sort
' 指定排序区域
.SetRange Range("A1").CurrentRegion
' 包含表头
.Header = xlYes
' 应用工作表排序
.Apply
End With
End Sub
自定义排序
AddCustomList 方法
如果要按自定义序列进行排序,需要先使用 Application 对象的 AddCustomList 方法向“自定义序列”列表添加自定义序列,再使用 GetCustomListNum 方法取得自定义序列在列表中的序列号,最后使用 OrderCustom 参数指定使用添加的自定义序列排序(取得的序列号加 1)。
其中“自定义序列”列表在 Excel 中的位置如下图所示:
语法
Application.AddCustomList (ListArray, ByRow)
参数
名称 | 必需/可选 | 数据类型 | 说明 |
---|---|---|---|
ListArray | 必需 | Variant | 将源数据指定为字符串数组或 Range 对象。 |
ByRow | 可选 | Variant | 仅当 ListArray 是 Range 对象时使用。如果为 True ,则从范围中的每一行创建自定义列表。如果为 False ,则从区域中的每个列创建自定义列表。
如果省略此参数,并且行数多于 (列,或区域中) 的行数和列数相等,则 Excel 将从该区域中的每个列创建自定义列表。 如果省略此参数,并且区域中的列数多于行,Excel 将从该区域的每一行创建自定义列表。 |
备注
如果尝试添加的列表已存在,则 AddCustomList 方法不起作用。
自定义排序示例
以下示例代码创建一个数组,使用该数组创建一个自定义排序序列,并以此序列来排序:
Sub CustomSort()
Dim customList As Variant, listNum As Long
' 初始化自定义排序数组
customList = Array("总经办", "采购部", "研发部", "销售部")
' 创建自定义序列
Application.AddCustomList customList
' 返回 customList 数组在“自定义序列”列表里的序列号
listNum = Application.GetCustomListNum(customList)
Range("A1").Sort Key1:=Range("A1"), _
Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=listNum + 1 ' 指定该参数时需在自定义序列号基础上加1
' 删除新添加的自定义序列
Application.DeleteCustomList listNum
End Sub
如果要使用单元格区域创建自定义序列,例如,自定义序列单元格区域 E2:E5,可以用如下代码替换上述 3-4 行代码:
' 初始化自定义序列的单元格区域
' customList = Range("E2:E5")
运行效果如下图所示: