按列数可变的列对数据进行排序

时间:2019-05-09 19:34:18

标签: excel vba

我已经有一段时间没有使用VBA了,我非常生锈。 我有一个Excel工作表,其中有几列数据。 例如,现在我在A到E列中有数据。A列中的所有行都已满,但是对于下一列,某些单元格可以为空。我正在尝试编写一个宏,该宏将按以下顺序自动对数据进行排序:  对A列中的数据进行排序,然后对B列中的数据进行排序,然后对C列中的数据进行排序,依此类推。 我希望宏具有自适应性,并且如果将数据添加到下一列(在这种情况下为F),仍然能够对数据进行排序。

我尝试了在线找到的不同解决方案,但是它们都不起作用,因为它们都暗示了预定义的列数。我记录了一个宏并尝试对其进行调整,但是我看不到如何使其足够灵活以至于看到一个新列。 我有一个宏,可以给我最后一列和最后一行包含数据。我正在尝试使用它,所以我可以告诉我的排序宏需要处理多少列,但是我看不到如何实现它。 这是我从录制宏后得到的内容:

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add 
Key:=Range("A1:F80") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, 
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add 
Key:=Range("B1:B80") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, 
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add 
Key:=Range("C1:C80") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, 
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add 
Key:=Range("D1:D80") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, 
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add 
Key:=Range("E1:E80") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, 
DataOption:=xlSortNormal

这行不通,因为这意味着我已经知道我有多少列。处理额外一列的唯一方法是在宏运行时添加一行代码(在本例中为F列)。那可能吗? 是否有更好/不同的方法提供更大的灵活性? 谢谢。

1 个答案:

答案 0 :(得分:2)

浏览排序范围的列,将其添加到排序顺序,如下所示:

Sub tgr()

    Dim rSort As Range
    Dim i As Long

    Set rSort = ActiveWorkbook.ActiveSheet.Range("A1").CurrentRegion

    With rSort.Parent.Sort
        .SortFields.Clear
        For i = 1 To rSort.Columns.Count
            .SortFields.Add rSort.Columns(i), xlSortOnValues, xlAscending, , xlSortNormal
        Next i
        .SetRange rSort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End Sub