(Хотя это не идеальное решение), решение состоит в том, чтобы реализовать сортировку в отсортированной таблице с использованием 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 за идею.