(Хотя это не идеальное решение), решение состоит в том, чтобы реализовать сортировку в отсортированной таблице с использованием 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 написано текстовое описание задачи. Первая часть кода определяет, сколько строк в таблице задач.
2) Первая сортировка сортирует задачи утром (столбец L), затем днем (столбец N) и затем вечером (столбец P).
3) Следующий цикл for находит количество строк, которые являются утренними задачами. Затем следующий вид сортирует утренние задачи по приоритету. Затем то же самое делается для дневных задач и вечерних задач.
Спасибо @ fixer1234 за идею.