2017-02-10 5 views
1

У меня есть рабочий лист Excel с таблицей, как это:получить максимальное значение из таблицы поиска

Index Threshold 
1  0 
2  10 
3  20 
... 

Тогда у меня есть другая таблица со значениями:

Values 
5 
11 
14 
22 

То, что я хочу, чтобы реализовать формулу который отображает «Значения» на максимальный «Индекс», который возможен без превышения «порога», например:

Values Threshold Index 
5  -> 0   -> 1 
11  -> 10  -> 2 
14  -> 10  -> 2 
22  -> 20  -> 3 

Я думаю, что могу реализовать двоичное дерево IF() со стоимостью log(n), но это очень громоздко и громоздко. Например (T* пороги, V* являются значением и I* являются индексами):

IF(V1 < T3;IF(V1 < T2;I1;I2);IF(V1 < T4;I3;I4)) 

Это сбалансированное IF() дерева как:

  T3 
     / \ 
    T2  T4 
    /\ /\ 
    I1 I2 I3 I4 

Есть ли лучше (более удобный) способ реализации этого ?

Это только суть фактического листа, над которым я работаю. Реальные данные двумерны, распространены на многих страницах и намного больше (сотни порогов и тысяч значений).

Специальная копия & с пастой очень трудно обрабатывать (создавать, тестировать и поддерживать).


EDIT: фактическое решение

Итак, это после некоторого изучения этого вопроса, и я хочу, чтобы показать решение, которое работало для меня. Функция MATCH() была фундаментальной, но недостаточно.

Прежде всего, пороги не указывают максимально допустимое значение но минимальное требуемое значение. Поэтому заголовок вводит в заблуждение. Что мне нужно было сделать:

  • изменить пороговый диапазон;
  • использование MATCH()-1 сравнение type.

Чтобы изменить диапазон, я использовал эту формулу, занимая клетки в F2:F102 диапазоне:

INDEX(C$2:C$102;COUNTA(C:C)+1-ROW()) 

Для того, чтобы соответствовать я использовал:

MATCH(D2;F$2:F$102;-1) 

Этот последний матч без INDEX(), потому что возвращается смещение уже то, что мне нужно.

Благодаря Скотту Кранеру за то, что он поставил меня на правильные пути!

ответ

1

Использование INDEX/MATCH:

=INDEX(A:A,MATCH(E2,B:B,1)) 

Вам может понадобиться использовать ; вместо , для локальных настроек:

=INDEX(A:A;MATCH(E2;B:B;1)) 

enter image description here

+0

Очень приятно! Я просто тестировал его на меньшем наборе данных и, как правило, он работает, но есть ошибки индексирования. Все значения являются целыми числами, и ошибка появляется только при более высоких значениях. Для 'T = 5, V = 4' он дает мне предыдущий индекс' I = 4', а не правильный 'I = 5'. Любая идея, как это может быть? Я не могу просто добавить '+ 1', потому что для более низких значений (' V <4') это правильно. Корректировка его вручную исказила бы нижнюю часть в ошибке :( – pid

+0

Мне пришлось уйти, и я не вернусь в течение нескольких часов, я не понимаю. Если я ставлю '10' в E3, это даст мне 2, если это будет 1 ? –

+0

Нет, 2 правильно. То, с чем я работаю, - это более сложные данные, но я могу управлять им, используя формулу промежуточной коррекции. «MATCH()» - это то, что мне нужно, поэтому этот вопрос принят и сделан! Большое спасибо и не против предыдущего комментария :) – pid

Смежные вопросы