【问题标题】:Sorting data in columns with variable number of columns对具有可变列数的列中的数据进行排序
【发布时间】:2019-05-10 03:43:33
【问题描述】:

我有一段时间没有使用 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 列)。那可能吗? 是否有更好/不同的方法提供更大的灵活性? 谢谢。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    遍历排序范围的列以将它们添加到排序顺序中,如下所示:

    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
    

    【讨论】:

    • 它运行良好,谢谢。我从未使用过 CurrentRegion 属性,这将是一个有用的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多