Как условно отсортировать список Excel с использованием кода VBA

Достаточно просто отсортировать список с помощью стандартных инструментов сортировки Excel или применить функцию непосредственно в коде VBA. Однако несколько сложнее отсортировать список, в котором вы должны применять свои собственные критерии.

Пример условной сортировки

Типичным сценарием может быть сортировка следующего списка стран в алфавитном порядке, но крупные регионы, такие как США, Великобритания и Япония, всегда находятся в начале списка.

 

Country
New Zealand
Australia
USA
Mexico
Belgium
UK
Japan

Мы создаем новый список с простым кодом VBA, который вы можете настроить в соответствии со своими потребностями.

Организовать код

Одним из решений этой проблемы является организация списка таким образом, чтобы верхние страны были наверху, а затем сортировали две области списка по отдельности.

Сначала мы определяем названия и количество стран, которые должны быть показаны в списке выше.


topItems = ",USA,UK,Japan,"
ctItems = UBound(Split(topItems, ",")) - 1

Далее мы можем выбрать список и установить счетчик для числа «Топ» стран и «Другие».


Set rng = ActiveCell.CurrentRegion
top = 1
others = 1

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


For x = 2 To rng.Rows.Count

Если текущим значением ячейки является одна из лучших стран, мы перемещаем значение в верхнюю часть нового списка, а если нет, то перемещаем его в нижнюю часть нового списка.


If InStr(topItems, "," & rng.Rows(x) & ",") Then
top = top + 1
Cells(top, 2) = rng.Rows(x)
Else
others = others + 1
Cells(others + ctItems, 2) = rng.Rows(x)
End If
Next

Наш список теперь реорганизован следующим образом, и нам нужно только отсортировать нижнюю часть списка в столбце 2.


USA
UK
Japan
New Zealand
Australia
Mexico
Belgium

Следующий код сортирует список среди верхних стран в столбце 2. Поскольку мы знаем, сколько существует верхних стран, диапазон начинается на две строки ниже этого значения — чтобы учесть заголовок.


Set rng = Range("b" & ctItems + 2 & ":" & ActiveCell.End(xlDown).Address)
rng.Sort Key1:=Range("b1"), order1:=xlAscending

Код выдает конечный результат, который выглядит следующим образом:


USA
UK
Japan
Australia
Belgium
Mexico
New Zealand

Одной из областей развития может быть расположение стран в определенном порядке. Было бы достаточно просто написать решение, но хорошая практика — иметь масштабируемое решение. Например, это может быть список клиентов, и вам нужно выделить 100 лучших покупателей.

резюме

Этот короткий код VBA предлагает решение проблемы, которая не может быть легко решена с помощью стандартных инструментов Excel. С таким сценарием часто сталкиваются разработчики VBA, и он является хорошим кандидатом для хранения в удобном месте для дальнейшего использования.

Как условно отсортировать список Excel с использованием кода VBA

Как условно отсортировать список Excel с использованием кода VBA

Добавить комментарий