У одного из моих читателей появилась как мне показалась интересная задача. И вот как она сформулирована:
«Можете подсказать как в VBA с текущей страницы Excel считать значения из заранее определённых ячеек, которых может быть до 32х (например, диапазон А1:A32), потом из этих значений найти максимальное из них (например, это А5), а после искать уже максимальное значение из оставшихся ячеек (в диапазоне А1:A4, А6:А32) и так далее до того, как не кончатся значения»
Спросив разрешения у подписчика на опубликования статьи по этой теме и, получив его, задался вопросом - правильно ли я понял поставленную перед ним задачу, а именно:
- Прочитать значения из заранее определённого диапазона (например, A1:A32).
- Найти максимальное значение в этом диапазоне и запомнить его.
- Исключить ячейку с найденным максимальным значением из дальнейших рассмотрений.
- Повторить процесс нахождения максимального значения среди оставшихся ячеек до тех пор, пока не закончатся значения.
Удостоверившись в этом, давайте вместе попробуем провернуть это мероприятие.
Итак, мы имеем диапазон со значениями (числовыми):
📌 Скачать файл пример, можно в конце статьи.
Для реализации этой задачи давайте напишем следующий код на VBA и разберем его:
В принципе поясняющие строки в коде уже есть, но давайте разберём некоторые моменты.
Про объявление переменных говорить не буду (раз дошли до этой статьи), а вот пару строк интересные.
Здесь мы инициализируем максимальное значение минимальным значением в диапазоне и сбрасываем указатель на ячейку с максимальным значением.
Итак, первая строка:
- WorksheetFunction.Min(диапазон): Функция WorksheetFunction.Min возвращает минимальное значение в указанном диапазоне ячеек. В данном случае, это минимальное значение в диапазоне A1:A32.
- Зачем это нужно? Когда мы начинаем поиск максимального значения, нам нужно иметь какое-то начальное значение, с которым будем сравнивать каждую ячейку. Если мы начнем с самого маленького значения в диапазоне, то любое значение, большее этого, будет найдено и правильно идентифицировано как новое максимальное.
- Пример: Если в диапазоне значений есть числа от 1 до 100, и минимальное значение в диапазоне равно 1, то мы начинаем поиск с этого значения. Если первая проверенная ячейка имеет значение 50, оно станет новым максимальным значением, потому что 50 больше, чем 1.
Вторая строка:
- Set максЯчейка = Nothing: Эта строка кода сбрасывает переменную максЯчейка, устанавливая её значение в Nothing (ничто).
- Зачем это нужно? Эта строка гарантирует, что перед началом нового цикла поиска максимального значения, переменная максЯчейка не указывает ни на какую ячейку. Мы будем использовать эту переменную, чтобы сохранить ссылку на ячейку, которая содержит текущее максимальное значение.
- Пример: Если на предыдущем шаге переменная максЯчейка указывала на ячейку A5 с максимальным значением, то перед началом нового поиска мы обнуляем эту переменную, чтобы избежать путаницы и начать новый поиск с так сказать с «чистого листа» или если угодно с чистого состояния.
Продолжим:
Внутренний цикл проходит по каждой ячейке в диапазоне. Если ячейка не пустая и её значение больше текущего максимального, обновляем максимальное значение и сохраняем ссылку на эту ячейку.
И строка максЗначения(i) = максЗначение. Запоминаем найденное максимальное значение в массиве.
Если код проходить пошагово, то картинка будет выглядеть следующим образом:
По итогу макрос выполнил следующее:
- Определил диапазон ячеек (в данном случае A1:A32).
- Инициализировал массив для хранения максимальных значений.
- В цикле искал максимальное значение среди оставшихся ячеек и запомнил его.
- Очистил ячейку с найденным максимальным значением, чтобы исключить её из дальнейших рассмотрений.
- Повторил процесс до тех пор, пока не обработал все ячейки.
- Вывел найденные максимальные значения в столбец B.
Как бонус я дописал пару коротеньких макросов и вывел кнопки на лист, чтобы вы могли поэкспериментировать.