【VBA研究】排序编程代码

作者:iamlaosong

1、在对Excel处理时经常会对工作表中的数据排序,排序代码怎么写?通过录制宏可以很容易得到(我学习VBA的方法基本就是查资料、录制宏),例如2003版可以得到如下排序语句:

Rows("1:1500").Select
Selection.Sort key1:=Range("L2"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    SortMethod:=xlPinYin, DataOption1:=xlSortNormal

代码是对L列进行排序,如果还有其它列,可以增加:
Rows("1:1500").Select
Selection.Sort key1:=Range("L1"), Order1:=xlAscending, _
    key2:=Range("A1"), Order2:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    SortMethod:=xlPinYin, DataOption1:=xlSortNormal    

排序语句实际就是Range对象的一个方法Sort,语句中参数变量排序关键字key1的值是Range("L1"),其中列号后面的行号似乎没什么用,所以Range("L2")、Range("L3")都没什么问题,也可以用列标题(相当于字段名),比如key1:="加油站编码"(这样写表示第一行包含标题,所以Header参数必须是:Header:=xlYes),多排序关键字,可以依次使用key2、key3等,2003版最多三个关键字。每个排序关键字可跟一个指定升序或降序的关键字,如Order1(也可以或略,默认升序)。除了排序关键字参数变量外,还有一个重要的参数变量就是Header,其值为xlGuess、xlYes或xlNo,表示指定第一行是否包含标题,其中 xlGuess 表示由 Microsoft Excel 确定是否有标题,如果有,确定标题位于何处,其它两个分别表示有标题和无标题。排序时最好明确标题是否存在,以免发生错误,造成数据丢失。

2、上述语句是先选中,后排序,也可以在排序语句中指定排序范围,即将Selection.Sort改为:
ActiveSheet.Range("A1:M1500").Sort
如果非当前工作表,则语句如下:
Worksheets("Sheet1").Range("A1:M1500").Sort _
    Key1:=Worksheets("Sheet1").Range("L1"), _
    Key2:=Worksheets("Sheet1").Range("A1")

3、工作表中如有筛选,会影响排序结果,所以排序前应取消筛选,用下列语句判断并取消:

If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter

4、上述语句中的位置参数,也可以用变量表示,如下面排序语句就含有变量,以增加程序的灵活性:

    QSH = Cells(15, 3)              '数据起始行
    SPLB_col = Cells(24, 3)         '商品类别列A
    JYZBM_col = Cells(16, 3)        '加油站编码列L
   
    If Dir(DatFullName, vbNormal) <> vbNullString Then
        
        Workbooks.Open Filename:=DatFullName            '打开订单文件
        If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter
        lineno = [C65536].End(xlUp).Row           '行数,最后一行应该为空
        '按加油站代码排序
        Rows((QSH - 1) & ":" & lineno).Select
        Selection.Sort Key1:=Range(JYZBM_col & "1"), Order1:=xlAscending, _
            Key2:=Range(SPLB_col & "1"), Order2:=xlAscending, Header:=xlYes, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            SortMethod:=xlPinYin, DataOption1:=xlSortNormal

5、语句中其它参数的含义是:

OrderCustom   Variant 类型,可选。本参数是从 1 开始的整数,指定了在自定义排序顺序列表中的索引号。如果省略 OrderCustom参数,则使用常规排序。

MatchCase   Variant 类型,可选。如果为 True,则进行区分大小写的排序;如果为 False,则排序时不区分大小写。对数据透视表进行排序时,不能使用本参数。

Orientation  XlSortOrientation 类型,可选。排序方向。

XlSortOrientation 可为以下 XlSortOrientation 常量之一。
xlSortRows 默认值。按行排序。
xlSortColumns 按列排序。
SortMethod  XlSortMethod 类型,可选。排序类型。对于所选择或安装的不同语言支持(例如:美国英语),以上某些常量可能不可用。

XlSortMethod 可为以下 XlSortMethod 常量之一。
xlStroke 按每个字符的笔划数量排序。
xlPinYin 默认值。按字符的汉语拼音顺序排序。
DataOption1  XlSortDataOption 类型,可选。指定如何对 key 1 中的文本进行排序。对数据透视表进行排序时,不能使用本参数。

XlSortDataOption 可为以下 XlSortDataOption 常量之一。
xlSortTextAsNumbers 将文本作为数字型数据排序。
xlSortNormal 默认值。分别对数字和文本数据进行排序。
DataOption2  XlSortDataOption 类型,可选。指定如何对 key 2 中的文本进行排序。对数据透视表进行排序时,不能使用本参数。

XlSortDataOption 可为以下 XlSortDataOption 常量之一。
xlSortTextAsNumbers 将文本作为数字型数据排序。
xlSortNormal 默认值。分别对数字和文本数据进行排序。
DataOption3  XlSortDataOption 类型,可选。指定如何对 key 3 中的文本进行排序。对数据透视表进行排序时,不能使用本参数。

XlSortDataOption 可为以下 XlSortDataOption 常量之一。
xlSortTextAsNumbers 将文本作为数字型数据排序。
xlSortNormal 默认值。分别对数字和文本数据进行排序。

6、说明

对于特定的工作表,每次使用本方法时,将保存对 Header、Order1、Order2、Order3、OrderCustom 和 Orientation 的设置。如果在下次调用本方法时不指定这些参数的值,则会使用这些保存的值。如果不使用这些保存的值,在每次使用 Sort方法时请明确设置这些参数的值。

不能转换为数字型数据的文本字符串按常规排序。

注意   如果使用 Sort方法时没有定义参数,则 Microsoft Excel 会对所选定的要排序的区域按升序排序。

7、2007版录制的排序语句和2003版完全不同,新的形式Sort不再是对象Range的方法,而是对象Sheet的属性,此属性下面还有很多子属性,其中SortFields子属性用于设置排序关键字,SetRange设置范围,所有属性设置完成后通过方法Apply完成排序,录制的代码是:

Sub Macro1()
    ActiveWorkbook.Worksheets("10.2批配送单-安徽中石油.xls").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("10.2批配送单-安徽中石油.xls").Sort.SortFields.Add Key:= _
        Range("L2:L1533"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    ActiveWorkbook.Worksheets("10.2批配送单-安徽中石油.xls").Sort.SortFields.Add Key:= _
        Range("N2:N1533"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    With ActiveWorkbook.Worksheets("10.2批配送单-安徽中石油.xls").Sort
        .SetRange Range("E1:N1533")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
为了避免具体的工作表名称(比如名称经常更换),语句中的ActiveWorkbook.Worksheets("10.2批配送单-安徽中石油.xls")可以用ActiveSheet代替,如:

ActiveSheet.Sort.SortFields.Clear

录制的宏总是比较啰嗦的,很多属性都是默认的,可以不管,上述代码可以简化为(当然还可以进一步简化):

Sub Macro2()
    With ActiveSheet.Sort
        .SortFields.Add Key:=Range("L2"), Order:=xlAscending
        .SortFields.Add Key:=Range("A2"), Order:=xlAscending
        .SetRange Range("A1:N1533")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub



你可能感兴趣的:(【VBA研究】排序编程代码)