Excel - сортировка в сортировке

1170
James

У меня есть таблица 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  
0
Кто-нибудь может объяснить голосование против? Рад попытаться объяснить себя лучше. Если на этот вопрос уже есть ответ, пожалуйста, дайте мне знать. Я хорошо выглядел и не мог ничего найти, но не знал, какие поисковые термины использовать. James 8 лет назад 0
Вы смотрели на встроенную сортировку по нескольким столбцам? Вы можете сделать это в несколько шагов, если у вас слишком много столбцов. fixer1234 8 лет назад 0
Да. Я попытался использовать встроенную сортировку нескольких столбцов. Я не могу заставить это работать, если я только использую это однажды. Но теперь вы предложили использовать его несколько раз, я думаю, у меня есть решение: 1) Сортировать все задачи утром, затем днем ​​и вечером в порядке убывания. 2) Выберите все утренние задачи и отсортируйте только их по приоритету. Затем выберите все дневные задачи и отсортируйте только их по приоритету. Наконец, сортируйте все вечерние задачи по приоритету. James 8 лет назад 0
Вы можете сделать несколько столбцов одновременно. Сортируйте все по приоритету в первом порядке, тогда он будет уже в порядке, когда вы сортируете оставшиеся столбцы. Это сэкономит несколько шагов. Вы должны быть в состоянии сделать это в два этапа. fixer1234 8 лет назад 1
У меня нет готового доступа к Excel, и я забываю, сколько вариантов сортировки вы можете сделать за проход, но я знаю, что это как минимум два. Таким образом, шаги будут: всегда выбирать весь блок данных. 1-й проход: 1-й сорт col = утро, 2-й сорт col = приоритет. 2-й проход: 1-й сорт col = вечер, 2-й сорт col = вечер. fixer1234 8 лет назад 1
Я не понимаю, что вы имеете в виду, выбирая сортировку за проход. James 8 лет назад 0
Выделите весь блок данных, затем выберите «Сортировать» в меню. Я забыл, включает ли он сразу несколько мест для ввода столбцов сортировки, или вы щелкаете по чему-то, чтобы добавить дополнительные столбцы сортировки, но вы можете указать несколько столбцов для сортировки. Верхнее окно ввода помечено как первый столбец сортировки или аналогичный. Введите букву столбца и укажите направление сортировки. Следующее окно ввода помечено как второй столбец сортировки или аналогичный; введите букву столбца и выберите направление сортировки. Нажмите OK, это сделает сортировку. Это пропуск. Сделайте это снова с двумя колонками для второго прохода. fixer1234 8 лет назад 1

1 ответ на вопрос

1
James

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

Похожие вопросы