我有一份待办事项的 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 提出的想法。