跳到主要内容

数据排序

Range.Sort 方法

语法

Range.Sort (Key1Order1Key2TypeOrder2Key3Order3HeaderOrderCustomMatchCaseOrientationSortMethodDataOption1DataOption2DataOption3)

参数

名称 必需/可选 数据类型 说明
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")

运行效果如下图所示:

自定义排序
自定义排序

评论

您的电子邮件地址不会显示出来。*号为必填项。