2009-12-15 7 views
2

У меня возникла проблема с созданием необычной формулы поиска в Excel.Excel: нужна помощь с необычной функцией поиска (отсортированный столбец отличается от столбца поиска)

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

Сценарий выглядит следующим образом:

  • таблица отсортирована в порядке возрастания на колонке B.
  • Для заданного параметра Р, я теперь хочу найти первый значение, начиная с верхней и снижается, что больше или равно этому параметру P.
  • Затем функция должна вернуть соответствующее значение B.

Таблица (часть выключена, полная таблица намного больше):

A  B 
1 640 4.5 
2 1600 7.0 
3 640 7.5 
4 1280 12.0 
5 1920 16.5 
6 2560 21.0 
7 1600 19.8 
8 3200 26.8 
9 4800 33.8 

Например, скажем, мой параметр 1100, то я хочу, чтобы моя формула для возврата 7.0, потому что первая запись при поиске вниз в столбце А, который больше или равен 1100, равен 1600, который имеет соответствующее значение В 7,0

Я пробовал свою удачу с Array Formula's (также известный как «ctrl-shift-enter formula's») и построил что-то вроде этого:

{=INDEX(table; 
     MATCH(MIN(IF(columnA-$C1>=0;columnA;FALSE)); 
       IF(columnA-$C1>=0;columnA;FALSE); 
       0); 
     2)} 

с С1, содержащий мой параметр, таблицу диапазон A1: В9 и Columna диапазон В1: В9

Но это не работает (в приведенном выше примере, это возвращает 12.0, потому что 1280 выбирается функцией MIN()).

Решение Я не хочу использовать: я мог бы написать несколько VBA могли пройти через стол, но я не хочу, чтобы сделать это (из-за раздражающим «макро предупреждения», и потому, что Excel на Mac больше не поддерживает VBA)

У кого-нибудь есть ключи?

+0

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

+0

@Ben: нет. Таблица Pivot очень полезна, но я нахожу их немного сложными, когда вы не используете их ежедневно (как это имеет место для меня). И я хочу сохранить решение/проблему в одной программе, нет необходимости в доступе :-) – Rabarberski

ответ

4

Вы можете использовать

{=INDEX(B1:B9,MIN(IF(A1:A9>C1,ROW(A1:A9),FALSE)))} 

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

+0

Спасибо! Ваше решение заставил меня идти. Мне пришлось добавить небольшую коррекцию для поддержки моей таблицы, не начиная с первой строки. Я изменил его на {= INDEX (B1: B9, MIN (IF (A1: A9> C1, ROW (A1: A9), FALSE)) - ROW (A1: A9) +1)}, который теперь работает нормально. Еще раз спасибо! – Rabarberski

1

Если вам не нужна формула массива, которую вы могли бы попробовать = OFFSET ($ C $ 5, MATCH ($ A $ 17, B5: B13), 0), где C5 - начало вашего столбца B, B5: B13 - это столбец A17 и A17 вы стоите против.

Ninja Редактировать: Вот версия, которая работает для меньшего или , равного бит вашей спецификации. = OFFSET ($ C $ 5, IF (ISNA (MATCH ($ A $ 17, B5: B13,0)), IF (ISNA (MATCH ($ A $ 17, B5: B13)), 0, MATCH ($ A $ 17, B5: B13)), MIN (MATCH ($ A $ 17, B5: B13,0) -1, MATCH ($ A $ 17, B5: B13)), 0)

+0

Если возможно, я бы предпочел не использовать формулы массива. Но, к сожалению, формула не работает из-за того, как работает MATCH(). Две проблемы: (a) она не дает значения для значения ниже первого значения A в списке, (b) оно дает следующее значение, когда значение соответствует элементу в столбце A. Спасибо за усилие! – Rabarberski

+0

Добавлена ​​обновленная версия – avid

+0

Вау, быстрое обновление. Тем не менее, я уже пошел с решением AdamRalph. Не проверял ваш ниндзя-редактирование, так как он требует много упражнений на мозг :-) – Rabarberski

0

Предполагая, что таблица данных находится в диапазоне A2 : B10 со значением вы ищете на в ячейке B1, следующее, кажется, работает:

=IF(B1<A2,B2,IF(ISNA(VLOOKUP(B1,$A$2:$B$10,2,FALSE)),INDEX(B2:B10,MATCH(B1,A2:A10)+1),VLOOKUP(B1,$A$2:$B$10,2,FALSE))) 

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

+0

Спасибо за внимание! Как я объяснил в сообщении авида, это действительно проблема. – Rabarberski