Excel - 排序中的排序

Excel - 排序中的排序

我有一份待办事项的 Excel 电子表格。电子表格中的每一行都是一项待办事项,每一列都给出了该待办事项的一个属性(例如,待办事项的优先级)。我还有三列表示我想在今天早上、下午还是晚上做这件事。

我希望能够按照以下方式对这些待办事项进行排序:

1)在顶部,我想要早上的所有待办事项。我希望这些待办事项按优先级排序,

2)然后我想要下午的所有待办事项。我希望这些待办事项按优先级排序,

3)然后是晚上要做的事情,按优先级排序,

4) 然后是所有剩余的待办事项。

更多细节:

  • 一些待办事项的优先级别为 1-5,但其他待办事项在优先级列中有一个空白单元格。

  • 如果我想在早上完成某项待办事项,我会在早上一栏填上 1。对于其他待办事项,早上一栏可能填 0,也可能填空。下午和晚上一栏也一样。

谢谢。

编辑:例如假设我有以下数据:

  Todo                 Priority    Morning   Afternoon  Evening
Write report               4          1    
Research                   5          1 
Dinner                                                     1
Prepare for meeting        3                     1
Read draft                 
Phone colleague            5                               1

我希望它按以下方式排序:

  Todo                 Priority    Morning   Afternoon  Evening 
Research                   5          1 
Write report               4          1   
Prepare for meeting        3                     1
Phone colleague            5                               1
Dinner                                                     1
Read draft                 

答案1

(虽然这不是理想的解决方案),一种解决方案是使用 VBA 在排序表中实现“排序”。以下代码执行此操作:

Sub SortByToday()
'
' SortByToday Macro
'

'
    Dim row As Long
    Dim rows As Long
    Dim topRow As Long
    Dim bottomRow As Long

    For row = 2 To 1000
        If Range("A" & row).Value = "" Then
            rows = row
            Exit For
        End If
    Next

    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("L2"), Range("L" & rows)) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("N2"), Range("N" & rows)) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("P2"), Range("P" & rows)) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range(Range("A1"), Range("W" & rows))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    'find the number of morning todos
    For row = 2 To 1000
        If Range("L" & row).Value <> 1 Then
            bottomRow = row
            Exit For
        End If
    Next

    'sort on the morning todos only
    If bottomRow <> 2 Then
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("D2"), Range("D" & bottomRow - 1)) _
            , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Sheet1").Sort
            .SetRange Range(Range("A2"), Range("W" & bottomRow - 1))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End If

    topRow = bottomRow

    For row = topRow To 1000
        If Range("N" & row).Value <> 1 Then
            bottomRow = row
            Exit For
        End If
    Next

    If bottomRow <> topRow Then
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("D" & topRow), Range("D" & bottomRow - 1)) _
            , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Sheet1").Sort
            .SetRange Range(Range("A" & topRow), Range("W" & bottomRow - 1))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End If

    topRow = bottomRow

    For row = topRow To 1000
        If Range("P" & row).Value <> 1 Then
            bottomRow = row
            Exit For
        End If
    Next

    If bottomRow <> topRow Then
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("D" & topRow), Range("D" & bottomRow - 1)) _
            , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Sheet1").Sort
            .SetRange Range(Range("A" & topRow), Range("W" & bottomRow - 1))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End If

End Sub

笔记:

1)A列是todo文本描述的地方。代码的第一部分是查找todos表中有多少行。

2) 第一次排序是按早上(L 列)对待办事项进行排序,然后按下午(N 列)进行排序,最后按晚上(P 列)进行排序。

3) 下一个 for 循环查找早上待办事项的行数。然后,下面的排序按优先级对早上待办事项进行排序。然后对下午待办事项和晚上待办事项执行相同的操作。

感谢@fixer1234 提出的想法。

相关内容