поиск по таблице Excel - PullRequest
       3

поиск по таблице Excel

0 голосов
/ 02 марта 2019

У меня есть таблица excel с пользовательскими данными, и когда они путешествуют в месяце:

 User    01/01/2019    02/01/2019   03/01/2019    04/01/2019    05/01/2019
 Joe                        A           X             X              X
 Jane                                                 A              X
 Bob         A              X           X             Z

Где A - первый в серии дней путешествий, который заканчивается в Z.

На отдельном листе у меня есть сводка, в которой я хочу узнать за определенный день, кто начинает путешествовать.

т.е.

Date Outbound    Name
02/01/2019       Joe

Если бы я заполнил дату отправления, я быМне нравится возвращать имя человека с буквой «А» в столбце, соответствующем этой дате.

Я не могу всю жизнь работать с Index, match или VLookup.Я не ценю формат листа, это только то, что было унаследовано.

Любые указатели очень ценятся!

Ответы [ 4 ]

0 голосов
/ 03 марта 2019
=INDEX(A:A,AGGREGATE(15,6,ROW($A$2:$A$4)/(INDEX($B$2:$F$4,0,MATCH($A$8,$B$1:$F$1,0))="A"),ROW(A1)))

Агрегат с функцией 15 выполняет операции с массивами.В связи с этим не используйте полные ссылки на столбцы в функции массива, иначе у вас будет много лишних вычислений.

POC

Настройте ссылки на ячейки в соответствии с требованиямиваши данные.скопируйте по мере необходимости, чтобы получить несколько имен.Чтобы избежать сообщения об ошибке, если отправление не найдено или вы выходите за пределы количества имен, отправляемых в течение дня, оберните все это в функцию IFERROR следующим образом:

=IFERROR(=INDEX(A:A,AGGREGATE(15,6,ROW($A$2:$A$4)/(INDEX($B$2:$F$4,0,MATCH($A$8,$B$1:$F$1,0))="A"),ROW(A1))),"NOT FOUND")

Измените «НЕ НАЙДЕНО» на«», если вы предпочитаете пропуски или собственное сообщение.

0 голосов
/ 03 марта 2019

Если Лист1 выглядит следующим образом: enter image description here

Лист2 может выглядеть следующим образом: enter image description here

Формула в столбце B:

=OFFSET(Sheet1!$A$1,MATCH("A",OFFSET(Sheet1!$A$1,0,MATCH(A1,Sheet1!$B$1:$F$1,),10,1),0)-1,0)

10 - это глубина поиска.

Если вам нужно более одного на дату, вам понадобится макрос VBA.

0 голосов
/ 03 марта 2019

Этот макрос найдет несколько имен для данной даты.

Function GetNameofTraveler(CellIn)

SourceShtNm = "Sheet1"  ' <---- Name of the shet that has the traveller data
DateRow = 1 ' <----- Chnage to match the row that has the travel dates
NameCol = 1 ' <----- Chnage to match the column that has the names

Set Datasheet = ActiveWorkbook.Sheets(SourceShtNm)

TargetDate = CellIn.Value

'* Get the range for the traveler data
LastCol = Datasheet.UsedRange.Columns.Count
LastRow = Datasheet.UsedRange.Rows.Count


NameList = ""
NumNames = 0
' Look for the date that matches
For i = 1 To LastCol
    If Datasheet.Cells(DateRow, i).Value = TargetDate Then
        ' Look for names on rows that have an "A"
        For j = 1 To LastRow
            If UCase(Datasheet.Cells(j, i)) = "A" Then
                NameList = NameList + Datasheet.Cells(j, NameCol) + vbLf
                NumNames = NumNames + 1
            End If
        Next j
    End If
Next i

If NumNames = 0 Then
    NameList = "  "
End If
GetNameofTraveler = Left(NameList, Len(NameList) - 1)

End Function

В ячейке используйте

=GetNameofTraveler(A2)

, где A2 имеет интересующую дату.

Лист путешественника выглядит так: enter image description here

0 голосов
/ 02 марта 2019

Если у вас только один пользователь на дату, вы можете использовать следующее:

=INDIRECT(ADDRESS(MATCH("A",INDIRECT(SUBSTITUTE(ADDRESS(1,MATCH($H$3,A1:F1,0)),"$1","")&":"&SUBSTITUTE(ADDRESS(1,MATCH($H$3,A1:F1,0)),"$1","")),0),1))

Возможно, существует версия меньшего размера, но она не может думать об этом так быстро.Если на дату больше пользователей, я думаю, вам нужна формула VBA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...