2013-09-12 2 views
4

Я пытаюсь добиться базового поиска с помощью INDEX и MATCH. Моя раскладка:Поиск с помощью INDEX и MATCH с двумя критериями

 
Sheet 1 
NAME | SITE | DATE 

Sheet 2 
NAME | SITE | DATE

Я хочу, чтобы колонка «SITE» в листе 1 для автоматического заполнения с сайтом из листа 2, где имя и дата матча.

Что я Пробовал

=INDEX('Sheet2'!B:B,MATCH(A1,'Sheet2'!A:A,0)) 

Это успешно соответствует имени, но как я могу включить дополнительный MATCH в формулу для соответствия как NAME и DATE?

+1

Объедините имя и дату вместе (в колонку-помощник или что-то в этом роде). Затем вы можете использовать vlookup или index/match или все, что хотите, в столбце помощника, чтобы убедиться, что совпадают имя и даты. – Stepan1010

ответ

4

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

SO18767439 example

В приведенном выше примере конкатенации, что посмотреть (а не где искать) делается «на лету».

+0

после битвы с решением от @barry houdini, я, наконец, сдался и использовал вспомогательную колонку, как вы предложили. – davejal

11

Вы можете использовать "формулу массива" как этот

=INDEX('Sheet2'!B:B,MATCH(1,(A1='Sheet2'!A:A)*(C1='Sheet2'!C:C),0))

CTRL +SHIFT + ENTER

.... или вы можете добавить еще одну функцию INDEX так что ему не нужно вводить «массив», то есть

=INDEX('Sheet2'!B:B,MATCH(1,INDEX((A1='Sheet2'!A:A)*(C1='Sheet2'!C:C),0),0))

или другой способ заключается в использовании LOOKUP как этот

=LOOKUP(2,1/(A1='Sheet2'!A:A)/(C1='Sheet2'!C:C),'Sheet2'!B:B)

Этот последний метод дал бы вам последний матч, если есть больше чем один ......

+0

Это похоже на правильное решение, но после долгих часов с этим я, наконец, сдался (все время рушится, может быть, из-за количества строк, которые нужно индексировать?). – davejal

+0

@ davejal Да, формулы массива являются вычислительно интенсивными и на больших наборах данных могут быть медленными или даже превосходить возможности процессора/памяти. Вы можете быть уверены, что каждый ответ Барри действительно работает, но иногда * не в конкретном сценарии. – pnuts

0

Вот решение без использования массива и без использования вспомогательной колонки:

<i>=INDEX(Table[returnColumnName], 
MATCH(1, INDEX((Table[lookupColumn1] = "arraysAreSlow") * 
(Table[lookupColumn2] = "avoidWherePossible"), 0, 1), 0))</i> 

Вот более продвинутое решение, которое выполняет поиск сетки:

<i>=INDEX(Table, 
MATCH(1, INDEX((Table[lookupColumn1] = "arraysAreSlow") * 
(Table[lookupColumn2] = "avoidWherePossible"), 0, 1), 0), 
MATCH("returnColumnName", Table[#Headers],0))</i> 
Смежные вопросы