
Общая формула
(=INDEX(data,MATCH(MIN(ABS(data-value)),ABS(data-value),0)))
Резюме
Чтобы найти наиболее близкое соответствие в числовых данных, вы можете использовать ИНДЕКС и ПОИСКПОЗ с помощью функций ABS и MIN. В показанном примере формула в F5, скопированная вниз, имеет следующий вид:
=INDEX(trip,MATCH(MIN(ABS(cost-E5)),ABS(cost-E5),0))
где поездка (B5: B14) и стоимость (C5: C14) - это именованные диапазоны.
В F5, F6 и F7 формула возвращает поездку, ближайшую по стоимости к 500, 1000 и 1500, соответственно.
Примечание: это формула массива, и ее необходимо вводить с помощью Ctrl + Shift + Enter, кроме Excel 365.
Объяснение
По сути, это формула ИНДЕКС и ПОИСКПОЗ: ПОИСКПОЗ определяет положение ближайшего совпадения, передает позицию в ИНДЕКС, а ИНДЕКС возвращает значение в этой позиции в столбце Поездки. Тяжелая работа выполняется с помощью функции ПОИСКПОЗ, которая тщательно настроена для соответствия "минимальной разнице", например:
MATCH(MIN(ABS(cost-E5)),ABS(cost-E5),0)
Пошагово, значение поиска вычисляется с помощью MIN и ABS следующим образом:
MIN(ABS(cost-E5)
Сначала значение в E5 вычитается из стоимости именованного диапазона (C5: C14). Это операция с массивом, и поскольку в диапазоне 10 значений, результатом является массив с 10 значениями, подобными этому:
(899;199;250;-201;495;1000;450;-101;500;795)
Эти числа представляют собой разницу между каждой стоимостью в C5: C15 и стоимостью в ячейке E5, 700. Некоторые значения отрицательны, поскольку стоимость ниже, чем значение в E5. Чтобы преобразовать отрицательные значения в положительные, мы используем функцию ABS:
ABS((899;199;250;-201;495;1000;450;-101;500;795))
который возвращает:
(899;199;250;201;495;1000;450;101;500;795)
Мы ищем самое близкое совпадение, поэтому используем функцию MIN, чтобы найти наименьшее различие, которое составляет 101:
MIN((899;199;250;201;495;1000;450;101;500;795)) // returns 101
Это становится значением поиска внутри MATCH. Поисковый массив создается, как и раньше:
ABS(cost-E5) // generate lookup array
который возвращает тот же массив, который мы видели ранее:
(899;199;250;201;495;1000;450;101;500;795)
Теперь у нас есть то, что нам нужно, чтобы найти позицию ближайшего совпадения (наименьшее различие), и мы можем переписать часть MATCH формулы следующим образом:
MATCH(101,(899;199;250;201;495;1000;450;101;500;795),0) // returns 8
Если в качестве значения поиска используется 101, ПОИСКПОЗ возвращает 8, поскольку 101 находится на 8-й позиции в массиве. Наконец, эта позиция передается в ИНДЕКС в качестве аргумента строки с именованным отключением диапазона в качестве массива:
=INDEX(trip,8)
а INDEX возвращает восьмую поездку в диапазоне "Испания". Когда формула копируется в ячейки F6 и F7, она находит самое близкое соответствие с 1000 и 1500, «Франция» и «Таиланд», как показано.
Примечание: если есть ничья, эта формула вернет первое совпадение.
С XLOOKUP
Функция XLOOKUP предоставляет интересный способ решения этой проблемы, поскольку для типа соответствия 1 (точное совпадение или следующее по величине) или -1 (точное совпадение или следующее по величине) не требуется сортировка данных. Это означает, что мы можем написать такую формулу:
=XLOOKUP(0,ABS(cost-E5),trip,,1)
Как и выше, мы используем абсолютное значение (cost-E5) для создания массива поиска:
(899;199;250;201;495;1000;450;101;500;795)
Затем мы настраиваем XLOOKUP для поиска нуля с типом соответствия, установленным на 1, для точного совпадения или следующего по величине. Мы предоставляем именованное путешествие по диапазону в качестве возвращаемого массива, поэтому результатом будет, как и прежде, «Испания».