VBA: 使用Sort方法进行排序

2022-09-20 14:50:27 浏览数 (2)

文章背景: 在Excel中,对数值的排序依据是数值的大小、对文本的排序依据是文本首字母。但是对文本与数字组合形式,excel排序的结果有时不尽如人意。如下的一列数据,是通过Sort升序后的结果:

代码语言:javascript复制
样品单号
SH22-022-1
SH22-022-12
SH22-022-13
SH22-022-7
SH22-022-8

可以看到,排序后的结果并不是我们想要的1,7,8,12,13。

面对这种情况,我们可以通过添加辅助列,然后基于辅助列进行排序。

1 单条件排序

单元格C2内的公式:TEXT(MID(B2,10,4),"0000")

通过录制宏的方式,得到sort排序的VBA代码,整理之后,记录如下:

代码语言:javascript复制
Sub 单条件排序()

    '1 设置排序的条件
    With ActiveSheet.Sort.SortFields
    
        .Clear                          '清除工作表所有的SortFields对象。
        .Add2 Key:=Range("C2:C6"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    
    End With
    
    '2 排序
    With ActiveSheet.Sort
    
        .SetRange Rows("2:6")           '排序区域
        .Header = xlNo                  '排序区域不包含标题
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
    End With
    
End Sub

(1)上述代码的功能是,基于辅助列(C列),对2至6行进行升序排列。

(2)DataOption有两个选择,分别是xlSortNormalxlSortTextAsNumbers。上述代码内采用的是xlSortNormal。

xlSortNormal -- default. Sorts numeric and text data separately.

xlSortTextAsNumbers -- Treat text as numeric data for the sort.

2 多条件排序

单元格C2内的公式:MID(B2,11,1)

单元格D2内的公式:TEXT(MID(B2,12,4),"0000")

通过录制宏的方式,得到sort排序的VBA代码,整理之后,记录如下:

代码语言:javascript复制
Sub 多条件排序()

    '1 设置排序的条件
    With ActiveSheet.Sort.SortFields
    
        .Clear
        
        .Add2 Key:=Range("C2:C8"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        
        .Add2 Key:=Range("D2:D8"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    
    End With

   '2 排序
    With ActiveSheet.Sort
    
        .SetRange Rows("2:8")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
    End With
    
End Sub

上述代码的功能是,基于辅助列(C列和D列),对2至8行进行升序排列。

参考资料:

[1] vba多条件排序(https://www.csdn.net/tags/NtTaYgzsNTA1MTUtYmxvZwO0O0OO0O0O.html

[2] “一网打尽”Excel排序过程中遇到的那些“坑”(https://cloud.tencent.com/developer/news/486934

[3] XlSortDataOption enumeration(https://docs.microsoft.com/en-us/office/vba/api/excel.xlsortdataoption

[4] 只需两步,轻松解决Excel数据混乱的问题(https://cloud.tencent.com/developer/news/879855

0 人点赞