文章背景: 在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
有两个选择,分别是xlSortNormal
和xlSortTextAsNumbers
。上述代码内采用的是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)