簡體   English   中英

使用 VBA 對 excel 中的每個單元格進行排序

[英]sorting every cell with data in excel using VBA

我錄制了一個宏來對這張表進行排序。 如何替換硬編碼范圍,以便此腳本適用於任意數量的行?

Worksheets(1).sort.SortFields. _
    Clear
Worksheets(1).sort.SortFields. _
    Add2 Key:=Range("A2:A130008"), SortOn:=xlSortOnValues, Order:=xlAscending _
    , DataOption:=xlSortNormal
Worksheets(1).sort.SortFields. _
    Add2 Key:=Range("B2:B130008"), SortOn:=xlSortOnValues, Order:=xlAscending _
    , DataOption:=xlSortNormal
Worksheets(1).sort.SortFields. _
    Add2 Key:=Range("C2:C130008"), SortOn:=xlSortOnValues, Order:=xlAscending _
    , DataOption:=xlSortNormal
Worksheets(1).sort.SortFields. _
    Add2 Key:=Range("D2:D130008"), SortOn:=xlSortOnValues, Order:=xlAscending _
    , DataOption:=xlSortNormal
Worksheets(1).sort.SortFields. _
    Add2 Key:=Range("E2:E130008"), SortOn:=xlSortOnValues, Order:=xlAscending _
    , DataOption:=xlSortNormal
Worksheets(1).sort.SortFields. _
    Add2 Key:=Range("P2:P130008"), SortOn:=xlSortOnValues, Order:= _
    xlDescending, DataOption:=xlSortNormal
Worksheets(1).sort.SortFields. _
    Add2 Key:=Range("Q2:Q130008"), SortOn:=xlSortOnValues, Order:= _
    xlDescending, DataOption:=xlSortNormal
With Worksheets(1).sort
    .SetRange Range("A1:R130008")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

這應該可以完成工作。 請試一試。

Sub StackOverflow()

    Dim Rng         As Range            ' range to sort
    
    With Worksheets(1)
        Set Rng = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)) _
                  .Resize(, .Columns("R").Column)
        ' .Columns("R").Column = 18 and may be replaced with this number
        
        With .Sort.SortFields
            .Clear
            ' specify the columns to sort on in sequence of priority
            .Add2 Key:=Rng.Cells(1), SortOn:=xlSortOnValues, _
                  Order:=xlAscending, DataOption:=xlSortNormal
            .Add2 Key:=Rng.Cells(2), SortOn:=xlSortOnValues, _
                  Order:=xlAscending, DataOption:=xlSortNormal
            .Add2 Key:=Rng.Cells(3), SortOn:=xlSortOnValues, _
                  Order:=xlAscending, DataOption:=xlSortNormal
            .Add2 Key:=Rng.Cells(4), SortOn:=xlSortOnValues, _
                  Order:=xlAscending, DataOption:=xlSortNormal
            .Add2 Key:=Rng.Cells(5), SortOn:=xlSortOnValues, _
                  Order:=xlAscending, DataOption:=xlSortNormal
            .Add2 Key:=Rng.Cells(16), SortOn:=xlSortOnValues, _
                  Order:=xlAscending, DataOption:=xlSortNormal
            .Add2 Key:=Rng.Cells(17), SortOn:=xlSortOnValues, _
                  Order:=xlAscending, DataOption:=xlSortNormal
        End With
        With .Sort
            .SetRange Rng
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
End Sub

請注意,在.Sort.SetRange中,必須指定整個范圍,而要設置每個鍵,只需要一個單元格來標識一列。 由於范圍內的單元格編號為 1,並且先向上然后向下編號,因此該范圍內的前 18 個單元格編號與下表范圍中的列號一致。 所以Key:=Rng.Cells(1)恰好是Worksheets(1).Cells(2, "A")基於Rng的指定方式。 我選擇了較短的語法,但效果是整個范圍將首先在 A 列上排序,然后再應用其他鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM