2015-11-13 2 views
0

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

Смотрите эту упрощенную установку:

enter image description here

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

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

ответ

1

Предполагая, что вы есть 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

по мере необходимости.

С уважением

+0

Спасибо очень много, она использует много памяти таким способом, но быть осторожным относительно размера поиска помогает это, и это работает точно так же, как я просил. –

+0

Как он «использует много памяти»? Каков фактический диапазон? Не A2: D8? Надеюсь, вы не использовали целые ссылки на колонки! –

+0

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

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