在表excel上查找

时间:2019-03-02 17:09:28

标签: excel vba excel-formula

我有一个带有用户数据以及当月出行时间的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

如果我填写出站日期,我希望它在与该日期相对应的列中返回带有“ A”的人员姓名。

我无法终生使用索引,比赛或VLookup解决问题。 我对工作表的格式并不珍贵,这只是继承的内容。

任何指针都非常感谢!

4 个答案:

答案 0 :(得分:1)

=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")

如果您喜欢空白或自己的消息,请将“找不到”更改为“”。

答案 1 :(得分:0)

如果每个日期只有一个用户,则可以使用以下内容:

=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公式。

答案 2 :(得分:0)

如果Sheet1看起来像这样: enter image description here

Sheet2可能如下所示: 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宏。

答案 3 :(得分:0)

此宏将为给定日期查找多个名称。

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