У меня есть таблица 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 ответ1

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 написано текстовое описание задачи. Первая часть кода определяет, сколько строк в таблице задач.

2) Первая сортировка сортирует задачи утром (столбец L), затем днем (столбец N) и затем вечером (столбец P).

3) Следующий цикл for находит количество строк, которые являются утренними задачами. Затем следующий вид сортирует утренние задачи по приоритету. Затем то же самое делается для дневных задач и вечерних задач.

Спасибо @ fixer1234 за идею.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .