Возврат значения CLOSEST к значению, найденному в большом диапазоне данных

351
r.phill

У меня есть один столбец A1:A20, значения которого мне нужно найти в большой таблице данных.

Для целей этого примера я скажу, что таблица данных варьируется от D1:Z25.

В идеале у меня должна быть формула Excel, которая сообщит мне, если Aв таблице найдено точное значение из столбца, и если нет, вернет ей значение CLOSEST .

Я могу использовать формулу

=IF(SUM(IF(D1:Z25=$A1,1,0))>=1,$A1,"")+ ctrl, shift, enterИ он будет возвращать EXACT значение, если оно находится в пределах таблицы.

Мой вопрос: если значение EXACT не находится в таблице, есть ли способ вернуть ему значение CLOSEST ?

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

1
Под ближайшим, вы имеете в виду наименьшую разницу в обоих направлениях? Если это так, вы можете объединить функцию SMALL с функцией ABS, примененной к разнице между значениями цели и массива. Если есть точное совпадение, разница нуля является наименьшей возможной разницей. У меня нет времени на разработку решения, но, например, `{= SMALL (ABS ($ A1- $ D $ 1: $ Z $ 25), 1)}` найдет минимальную разницу, поэтому в худшем случае посмотрите для точного соответствия A1 + diff и A1-diff. fixer1234 6 лет назад 0
Не могли бы вы поделиться некоторыми примерами данных, чтобы найти точное значение? Rajesh S 6 лет назад 0

2 ответа на вопрос

0
FezzikMontoya

Вот альтернативный способ решения вашей проблемы. К сожалению, он не работает в 2-мерных массивах, как в вашем случае. Если вы можете преобразовать свои значения в одномерный массив, например, D1: Z575. Приведенная ниже формула возвращает желаемое значение.

=INDEX(D1:Z575,MATCH(MIN(ABS(D1:Z575-A1)),ABS(D1:Z575-A1),0)) 

Важно: нажмите комбинацию клавиш Ctrl+ Shift+, Enterа не Enterтолько. Потому что формула работает, только если это формула массива .

Логика аналогична комментарию fixer1234, чтобы найти позицию минимальной разности и вернуть значение, используя эту позицию в функции INDEX .

Вот подробное объяснение формулы: Как найти ближайшее совпадение

0
fixer1234

Возможно, есть более элегантный способ сделать это, но здесь есть, по крайней мере, не элегантное решение. Формула становится большой, поэтому я объясню ее по частям.

enter image description here

Я хотел проиллюстрировать, как это работает, поэтому держал диапазон под контролем. Масштабируйте это к своим потребностям.

Мой массив данных D1: F10. Я просто заполнил его последовательными числами, потому что это было легко, и проиллюстрировал иллюстрацию. Формула не полагается на числа, являющиеся целыми числами или в определенном порядке. Я заменил несколько значений дубликатами некоторых совпадающих значений, чтобы убедиться, что формула работает.

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

Столбец B содержит наиболее близкое совпадение в массиве для каждого целевого значения (решения).

Формула построена из компонентов, поэтому я объясню компоненты, которые показаны в этой таблице:

enter image description here

Целевые значения реплицируются в столбце A. В столбце B определяется минимальная разница между целевым значением и ближайшим значением в таблице. Формула в B16:

{=MIN(ABS($D$1:$F$10-A1))} 

Это формула массива. Это компонент окончательной формулы, поэтому окончательную формулу необходимо вводить с помощью Ctrl Shift Enter.

Мы не знаем, в каком направлении находится различие, нужно ли нам прибавлять или вычитать, чтобы соответствовать ближайшему значению в таблице, поэтому мы пробуем оба. Чтобы найти соответствующее значение путем «округления вниз», он использует формулу в столбце C. Чтобы найти соответствующее значение путем «округления вверх», он использует формулу в столбце D. Один вычитает, а другой добавляет разницу:

=SUMPRODUCT(($D$1:$F$10=A1-B16)*$D$1:$F$10) =SUMPRODUCT(($D$1:$F$10=A1+B16)*$D$1:$F$10) 

Если первые круглые скобки верны, они будут оценены 1, в противном случае это будет 0. SUMPRODUCT умножает это на соответствующее значение ячейки и суммирует результаты.

Но обратите внимание на некоторые странные результаты.

  • Несколько целей возвращают ноль или не соответствуют. Это те случаи, когда совпадение найдено путем округления в другом направлении.
  • Цель, находившаяся посередине между двумя ближайшими значениями, возвращает нижнее совпадающее значение, округленное вниз, и более высокое совпадающее значение, округленное вверх. Если вам важно, какой из них выбран, упорядочите компоненты формулы, чтобы было выбрано округление в предпочтительном направлении.
  • Несколько значений в два раза больше, чем они должны быть. Это случаи, когда я продублировал ближайшее значение; формула добавляет в каждом.

Чтобы разобраться с этими случаями, мы посчитаем, сколько совпадений найдено. Это делается в столбцах E и F:

{=SUM($D$1:$F$10=A1-B16)} {=SUM($D$1:$F$10=A1+B16)} 

Эти компоненты также являются формулами массива. Формула в столбце E оценивает, равно ли значение каждой ячейки цели минус разница, которая равна Истине или Ложь ( 1или 0), и суммирует эти значения. Формула в столбце F та же самая, за исключением того, что она сравнивает с целью плюс разница.

Мы можем использовать эти результаты двумя способами: для проверки отсутствия совпадений (нулевого результата), чтобы выбрать, какой результат использовать, и в качестве количества совпадений для корректировки завышенного значения нескольких совпадений на предыдущем шаге.

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

Для выбранного действительного результата счет используется как делитель. Итак, формула для результата:

=IF(E16=0,D16/F16,C16/E16) 

Так вот как это работает. Чтобы превратить это в единую консолидированную формулу, необходимо заменить ссылки на ячейки формулой в указанной ячейке. Вот как выглядит консолидированная формула (я добавлю интервалы и переводы строк, чтобы сделать ее более читабельной; вы захотите удалить их, если хотите скопировать и вставить формулу):

{=IF(SUM($D$1:$F$10=A1-MIN(ABS($D$1:$F$10-A1)))=0,  SUMPRODUCT(($D$1:$F$10=A1+MIN(ABS($D$1:$F$10-A1)))*$D$1:$F$10)/SUM($D$1:$F$10=A1+MIN(ABS($D$1:$F$10-A1))),  SUMPRODUCT(($D$1:$F$10=A1-MIN(ABS($D$1:$F$10-A1)))*$D$1:$F$10)/SUM($D$1:$F$10=A1-MIN(ABS($D$1:$F$10-A1))))} 

Похожие вопросы