Здравствуйте, уважаемые читатели. Сегодня разбираем, как найти ближайшее большее значение в таблице. Многие начинающие пользователи применяют для этого формулу из нескольких вложенных друга в друга функций ЕСЛИ, однако есть и более простое решение.

Для такого поиска можно использовать комбинацию функций ИНДЕКС и ПОИСКПОЗ. Мы рассмотрим это на двух примерах.

Если нужно найти ближайшее меньшее – можно использовать функцию ВПР в режиме приблизительного поиска!

Поиск если данные отсортированы по убыванию

Так или иначе, но для приблизительного поиска ближайшего значения, таблицы с данными приходится сортировать. В статье о функции ПОИСКПОЗ я рассказывал, что она может искать ближайшее большее значение лишь в том случае, когда исходная таблица отсортирована по убыванию. Значит, рассматриваемый сейчас пример максимально удобен для работы.

прайс и заказ

В примере на картинке есть прайс-лист, цена в котором зависит от объема заказанной партии:

  • До 100 ед – 800 евро/ед
  • До 200 ед – 750 евро/ед
  • До 300 ед – 700 евро/ед и т.д.

Во второй таблице задается размер заказа. Требуется из прайса получить ближайшую большую партию и соответствующую ей цену. Давайте соберем формулу по частям:

  1. Ищем в прайсе ближайший больший заказ. Применяем функцию ПОИСКПОЗ в режиме поиска ближайшего большего: =ПОИСКПОЗ(E3;A3:A11;-1)
  2. Получаем цену для этой партии с помощью функции ИНДЕКС( массив ; номер_по_порядку ). Номером по порядку здесь будет результат предыдущего шага, поэтому вместо аргумента «номер» впишем предыдущую формулу: ИНДЕКС(B3:B11;ПОИСКПОЗ(E3;A3:A11;-1))
  3. Если в заказе указать партию, большую чем 5000 (максимальная в прайсе) – функция ПОИСКПОЗ вернет ошибку #Н/Д. Чтобы этого не было, применим функцию обработки ошибок ЕСНД. Обернём ею всю формулу и укажем, что в случае ошибки давать клиенту минимальную цену. Вот так:

=ЕСНД(ИНДЕКС(B3:B11;ПОИСКПОЗ(E3;A3:A11;-1));B3)

ближайшая большая партия найдена

Видите, получилось аккуратно, формула работает бесперебойно. Но так просто бывает не всегда, переходим к следующему примеру.

Поиск если таблица сортирована по возрастанию

Сейчас такой случай. В исходной таблице у нас этапы жизни человека, от рождения до 100 лет. Нужно ввести возраст и получить текущий этап и следующий.

этапы жизни

Таблица отсортирована по возрастанию, а это делает невозможным применение ПОИСКПОЗ, т.к. ей требуется убывание данных. Пересортировывать таблицу мы не будем, т.к. она будет выглядеть нелогично – от старого человека к молодому. Т.е. против хода времени. Это усложняет поиск следующего этапа жизни.

Я предлагаю простое решение проблемы. С помощью ПОИСКПОЗ мы сможем найти текущий этап (поиск ближайшего меньшего возможен сейчас), и выведем на экран не найденный индекс, а следующий. Вот так:

=ЕСЛИОШИБКА(ИНДЕКС(B3:B11;ПОИСКПОЗ(E3;A3:A11)+1);B11)

Формула отличается от предыдущего случая тем, что к результату ПОИСКПОЗ прибавляется единица, то есть сдвигаемся на следующий номер строки (к следующему этапу).

Кроме того, если указать возраст больше максимального – получим ошибку не #Н/Д, а #ССЫЛКА. Поэтому, я заменил функцию ЕСНД на ЕСЛИОШИБКА.

следующий этап найден

Вот и всё, задача реализована. Пишите в комментариях ваш возраст, буду определять, к какому этапу жизни вам готовиться!