Многоуровневая автоматическая сортировка Excel

#excel #vba #sorting

#excel #vba #сортировка

Вопрос:

Несколько дней пытался выяснить, как выполнить двухуровневую автоматическую сортировку в VBA. Мне удалось запустить автоматическую сортировку одного уровня, но когда я пытаюсь добавить второй уровень, он переопределяет сортировку первого уровня, которую я делал ранее. Данные хранятся в строках.

Вот что я пытаюсь настроить для автоматической сортировки

Это VBA, который я написал прямо сейчас для 1-го уровня или сортировки, который сортирует активные? Столбец

 Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Range("A1").Sort key1:=Range("A2"), _
          Order1:=xlDescending, Header:=xlYes, _
          OrderCustom:=1, MatchCase:=False, _
          Orientation:=xlTopToBottom
    End If
End Sub
  

Комментарии:

1. Добавьте ключ2 и порядок2

2. И отбросьте On Error Resume Next … это просто скрывает потенциальные ошибки.

3. Спасибо, я думаю, что теперь я работаю с этим. Private sub Worksheet_Change (обычно используется как диапазон) Если не пересекаются (цель, диапазон («A: A»)) Ничего, кроме диапазона («A1»). Ключ1 сортировки:= диапазон («A2»), _ Order1:=xlDescending, Заголовок:= xlYes, _ OrderCustom:=1, Совпадение:=False, _ key2:= Диапазон («B2»), _ Order2:=xlAscending, Заголовок:= xlYes, _ Orientation:=xlTopToBottomЗавершить, если завершить вложенный

4. Хотя только что заметил, что сортировка выполняется только при изменении Key1. Он правильно сортирует Key2, но если я просто внесу изменения в Key2, он не будет автоматически сортировать. Есть ли способ исправить это, помимо простого копирования и вставки предыдущей функции.

Ответ №1:

Вот новая формула, которую я написал благодаря вашим комментариям. Кажется, работает. Моя проблема раньше заключалась в том, что я продолжал выполнять Key2 и Order2 как новую функцию If, а не как часть предыдущей.

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Range("A1").Sort key1:=Range("A2"), _
          Order1:=xlDescending, Header:=xlYes, _
          OrderCustom:=1, MatchCase:=False, _
          key2:=Range("B2"), _
          Order2:=xlAscending, Header:=xlYes, _
          Orientation:=xlTopToBottom
    End If
End Sub