1. 程式人生 > >陣列排序系列(3)

陣列排序系列(3)

####工作表排序法

前面兩篇文章分享了兩種純演算法實現的排序方法。這次介紹一個其他型別的方法,Excel的排序功能非常簡單實用,即使是小白使用者也可以熟練操作,在VBA中藉助工作表排序也就成為一個實現數值排序的好方法。

Sub SortInSheet()
    Dim aintData(1 To 10) As Variant
    Dim avntData As Variant
    Dim i As Integer
    Dim intLB As Integer
    Dim intUB As Integer
    Dim rngData As Range
    intLB = LBound(aintData)
    intUB = UBound(aintData)
    For i = intLB To intUB
        aintData(i) = Application.WorksheetFunction.RandBetween(1, 100)
    Next i
    Debug.Print "Original Data: " & Join(aintData, ",")
    With ActiveSheet
        .Columns(1).Clear
        Set rngData = .[a1].Resize(intUB - intLB + 1, 1)
        rngData.Value = Application.Transpose(aintData)
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=rngData, _
                                SortOn:=xlSortOnValues, _
                                Order:=xlAscending, _
                                DataOption:=xlSortNormal
            .SetRange rngData
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
    avntData = Application.Transpose(rngData.Value)
    Debug.Print "After Sort: " & Join(avntData, ",")
End Sub

執行程式碼結果如下。

Original Data: 72,8,53,2,38,51,39,63,77,33 After Sort: 2,8,33,38,39,51,53,63,72,77

程式碼解析: 第15行程式碼清空工作表的第1列用於後續的排序操作。 第16行程式碼根據陣列元素的個數確定單元格區域的大小。 第17行程式碼將數值元素寫入單元格區域。 第18行到第30行程式碼呼叫工作表的排序功能。 第19行程式碼清空排序欄位。 第20行到第23行程式碼新增排序欄位,其中Order引數指定為升序排序。 第24行程式碼設定排序單元格區域。 第25行程式碼指定資料區域不包含表頭。 第21行程式碼指定忽略大小先區別。 第29行程式碼執行排序操作。 第32行程式碼將排序後的資料載入到陣列中。

此示例程式碼實現的是升序排序,如需使用降序,那麼只需要修改第22行程式碼如下。

Order:=xlDescending

相關文章連結: