Всем привет! 👋
Напомним, что в одном из обзоров мы рассматривали как отсортировать значения в массиве с использованием цикла For:
а так же способ сортировки "пузырьком":
Но этим, способы выполнить сортировку, не ограничиваются 😉
Сегодня разберем еще одно решение с использованием Метода Range.Sort
📢 Файл с исходным кодом размещен в конце статьи 🔽
▶️ Основные параметры
▶️ Ключ сортировки
- представляет собой данные в столбце или столбцах, которые требуется отсортировать. Он определяется либо заголовком столбца, либо именем поля, в зависимости от контекста.
Ключ сортировки играет важную роль в определении порядка сортировки и позволяет упорядочить данные в столбце или столбцах в нужном порядке, будь то по возрастанию или убыванию.
▶️ Сортировка в пределах одного столбца
Пусть имеем некоторый диапазон заданный одним столбцом (без заголовков) 🔽
🔘 Чтобы выполнить сортировку применим простой макрос:
Данный макрос выполняет простую сортировку по возрастанию для указанного диапазона ячеек (в данном случае, сортировка осуществляется для столбца A, начиная с ячейки A1 и заканчивая ячейкой A23)
Параметры:
📝 Результат:
📝 Аналогичный результат получим при сортировке текстовых данных:
А что если нужный столбец или диапазон содержат заголовки?
Как указывалось выше:
А потому, сделав в замену Header:=xlNo на Header:=xlYes:
📝 Получим нужный результат:
Все работает отлично! 😉 Но...
⚠️ Проблема данного макроса в том, что в нем "жестко" указан диапазон.
🔘 Чтобы снять данное ограничение внесем следующие изменения:
Отличие от предыдущего примера состоит в том, что сортировка будет применяться не к предопределенному, а к выбранному пользователем диапазону:
- В данном случае используется Selection, который представляет выделенный пользователем диапазон ячеек в момент выполнения макроса. Таким образом, сортировка будет производиться именно для выбранного пользователем диапазона.
- В параметре Key1 Selection указан как ключ сортировки. Это означает, что сортировка будет выполнена на основе значений в выбранном диапазоне ячеек.
Так же добавлена обработка ошибки, которая проверяет, был ли выделен какой-либо диапазон для сортировки или является ли выделенный диапазон пустым:
- Если условие НЕ выполняется, то выводится сообщение об ошибке, указывающее пользователю выделить диапазон для сортировки:
Затем процедура выходит из выполнения с помощью команды Exit Sub.
- Если условие выполняется, то сортировка происходит по выбранному столбцу как в изначальной версии кода.
Теперь макрос отлично справляется с задачей! 😉
▶️ Сортировка в пределах диапазона
А что если источник данных содержит несколько столбцов? 🔽
🔘 Чтобы выполнить сортировку по числу сделок используя подход выше применим макрос:
В данном случае диапазон ячеек определяется с помощью функции Range и указывается в аргументе Range("A2:C23").
Ключ сортировки Key1 указывается в аргументе Range("C2"), что означает, что сортировка будет выполняться по данным в столбце C, начиная с ячейки C2.
или
В данном случае параметр Header установлен на xlYes, что указывает на наличие заголовка в первой строке диапазона.
📝 Результат:
⚠️ Но проблема осталась! Макрос выполняет сортировку указанного диапазона "A2:C23".
🔘 Снять "ограничение" можно следующими образом:
При запуске процедуры проверяем, выделен ли диапазон для сортировки:
Далее появляется окно ввода, где пользователь может ввести номер столбца, по которому он хочет отсортировать данные:
🔔 Если пользователь оставляет окно ввода пустым или вводит некорректное значение, процедура прекращает выполнение.
После ввода номера столбца в диалоговом окне макрос проверяет корректность введенного значения:
- Если введен корректный номер столбца, процедура сортирует выбранный столбец по возрастанию:
- В случае, если указанный номер столбца выходит за пределы доступных столбцов, выводится соответствующее сообщение об ошибке:
▶️ Сортировка по убыванию
Выполнить сортировку по убыванию позволит параметр Order1:=xlDescending.
Когда данный параметр установлен на xlDescending, значения в указанном диапазоне будут отсортированы по убыванию, начиная с самого большого значения и заканчивая наименьшим.
🔘 Например, в рассмотренный ранее макрос внесем изменения:
В данном случае, диапазон данных A1:C23 сортируется по ключу с использованием столбца С1 в порядке убывания (xlDescending). Параметр Header установлен в xlYes, что означает наличие заголовков в данных.
📝 Результат:
▶️ Сортировка по нескольким столбцам
Добавление дополнительного условия позволит задать два поля сортировки.
Например для представленных ниже исходных данных выполним сортировку по Фамилии и по числу сделок:
🔘 Пример макроса:
Пользователю предлагается ввести номера двух столбцов, по которым будет производиться сортировка:
- Если номера столбцов корректные, сортировка производится на основе выбранных столбцов с указанием порядка сортировки:
- Если пользователь не вводит номера столбцов процедура прекращает работу;
- Если введены некорректные значения, макрос выдает соответствующие сообщения об ошибке.