Предполагая, что вы есть Excel 2010 или более поздней версии:
=INDEX($1:$1,AGGREGATE(14,6,COLUMN(A$2:D$8)/(A$2:D$8=O2),1))
Перепишите по мере необходимости.
Объяснение заключается в следующем:
Часть:
(A$2:D$8=O2)
просто возвращает массив булевых TRUE
/FALSE
значения, является ли каждая из ячеек в пределах этого диапазона равен ввод в O2 или нет, т.е. с использованием вашего примера:
{TRUE,FALSE,TRUE,FALSE;FALSE,FALSE,FALSE,FALSE;FALSE,TRUE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE;FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE}
Часть:
COLUMN(A$2:D$8)
возвращает номер столбца для каждого столбца в пределах указанного диапазона, то есть:
{1,2,3,4}
возвратно-поступательным этот массив, что содержащий наше условное булеву TRUE
/FALSE
возвращает, мы создаем массив, единственные числовые записи которого соответствуют столбцам, в которых наша строка поиска (т.е."Джеймс") находится, так как:
COLUMN(A$2:D$8)/(A$2:D$8=O2)
, который:
{1,2,3,4}/{TRUE,FALSE,TRUE,FALSE;FALSE,FALSE,FALSE,FALSE;FALSE,TRUE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE;FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE}
становится:
{1,#DIV/0!,3,#DIV/0!;#DIV/0!,#DIV/0!,#DIV/0!,#DIV/0!;#DIV/0!,2,#DIV/0!,#DIV/0!;#DIV/0!,#DIV/0!,#DIV/0!,4;#DIV/0!,#DIV/0!,#DIV/0!,#DIV/0!;#DIV/0!,#DIV/0!,#DIV/0!,#DIV/0!;#DIV/0!,#DIV/0!,#DIV/0!,#DIV/0!}
в силу того факта, что, когда подвергается к подходящей математической операции (из которой деление - одно), Boolean TRUE
/FALSE
значения принуждают к их числовые эквиваленты (TRUE=1
, FALSE=0
), а это означает, что, фактически, для любого числового значения х:
x/TRUE ⇒ x/1 = x
и:
x/FALSE ⇒ x/0 = #DIV/0!
путем установки AGGREGATE
(эквивалентно функции LARGE
), а второй - 6 (инструктируя его игнорировать любые ошибки в переданном массиве), мы можем извлечь самую большую colu Индекс млн, который отвечает нашим критериям, таким образом, что:
AGGREGATE(14,6,COLUMN(A$2:D$8)/(A$2:D$8=O2),1)
, который находится здесь:
AGGREGATE(14,6,{1,#DIV/0!,3,#DIV/0!;#DIV/0!,#DIV/0!,#DIV/0!,#DIV/0!;#DIV/0!,2,#DIV/0!,#DIV/0!;#DIV/0!,#DIV/0!,#DIV/0!,4;#DIV/0!,#DIV/0!,#DIV/0!,#DIV/0!;#DIV/0!,#DIV/0!,#DIV/0!,#DIV/0!;#DIV/0!,#DIV/0!,#DIV/0!,#DIV/0!},1)
возвращается 4.
Все, что осталось, чтобы передать это значение INDEX
, такие как:
INDEX($1:$1,AGGREGATE(14,6,COLUMN(A$2:D$8)/(A$2:D$8=O2),1))
который:
INDEX($1:$1,4)
возвращается:
13/11/2015
по мере необходимости.
С уважением
Спасибо очень много, она использует много памяти таким способом, но быть осторожным относительно размера поиска помогает это, и это работает точно так же, как я просил. –
Как он «использует много памяти»? Каков фактический диапазон? Не A2: D8? Надеюсь, вы не использовали целые ссылки на колонки! –
Каждая ячейка, которую вы укажете в этой формуле, будет обрабатываться, технически ли она за пределами последней используемой ячейки в диапазоне или нет. Таким образом, вы не можете ссылаться на произвольно большой диапазон без ущерба для производительности, полагая, что вы «покрываете свои базы». –