#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