Excel数组查找

时间:2015-08-24 21:22:19

标签: excel

我有一个带有一些id的excel行。我想从下面第二个表中的第一个表中查找id,并获取带有最大日期的id。输出应该只来自表1中行的id。

作为参考,“ID1”在单元格A1中,“ID”在单元格A4中。

我发布了一个类似的问题here,但我的要求发生了变化,并希望再次发布此问题。 @rwilson在之前的帖子中给了我一个有效的创意公式,但我没有说明表2中会有重复。在下面的表2中,“b”出现两次但是日期不同。以下数据样本行的公式输出应为“b”,因为它具有最大日期。我不能以任何方式对表格进行排序,因为我无法控制它。我需要引用它来输出带有最新日期的id。

ID1    ID2    ID3    ID4    id of maxdate
b      a      c      #N/A   formula

ID  Date            
b   1/26/2015           
b   1/28/2015           
a   1/26/2015           
d   1/29/2015           
c   1/27/2015           

更新的样本数据 此数据样本使用下面的@ Marc公式。输出应为b但显示为d。原因是索引基于最大日期。由于最大日期出现在d中,索引输出d默认为d。有没有办法告诉索引/匹配只对表1中出现的id进行索引/匹配?

ID1 ID2 ID3 ID4     id of maxdate
b   a   c   #N/A    d (should be b)

ID  Date            
b   1/26/2015           
c   1/26/2015           
a   1/26/2015           
d   1/28/2015           
b   1/28/2015   

作为参考,表1从单元格A1开始,表格2从单元格A4开始。这是单元格E2中的公式。

=INDEX($A$4:$A$9,MATCH(MAX(IF($A$4:$A$9=IFERROR(A2,""),$B$4:$B$9,0),IF($A$4:$A$9=IFERROR(B2,""),$B$4:$B$9,0),IF($A$4:$A$9=IFERROR(C2,""),$B$4:$B$9,0),IF($A$4:$A$9=IFERROR(D2,""),$B$4:$B$9,0)),$B$4:$B$9,0))

更新#2 这是基于@XOR公式的输出。这是一个不起作用的情况。

ID1 ID2 ID3 ID4     id of maxdate
b   a   d   #N/A    b (should be a)

ID  Date            
b   1/26/2015           
c   2/26/2015           
a   1/31/2015           
d   1/29/2015           
b   1/30/2015

3 个答案:

答案 0 :(得分:1)

修改

如果作为数组公式(Ctrl + Shift + Enter)输入,这应该可以得到答案:

=INDEX($A$4:$A$8,MATCH(MAX(IF($A$4:$A$8=A2,$B$4:$B$8,0),IF($A$4:$A$8=B2,$B$4:$B$8,0),IF($A$4:$A$8=C2,$B$4:$B$8,0)),$B$4:$B$8,0))

它基于重复以下公式,该公式在单元格A2中找到条目的最大日期(如果作为数组公式输入):

=MAX(IF($A$4:$A$8=A2,$B$4:$B$8,0))

使用Ctrl + Shift + Enter(数组公式)输入。

将其组合几次,然后执行INDEX() / MATCH()查找,您就可以获得该ID。你需要弄清楚如何处理相等的最大日期。

答案 1 :(得分:0)

我总是使用我称之为MAXAIF的功能。您可以将其添加到VBA模块中并在电子表格中使用它。

Function MAXAIF(ByVal id As Range, ByVal Criteria_Range As Range, ByVal Lookup_Range As Range)
    Dim max
    Dim ct As Integer
    For ct = 1 To Criteria_Range.Cells.Count
        If Criteria_Range.Cells(ct, 1).Value = id.Value Then
            If max = Empty Then
                max = Lookup_Range.Cells(ct, 1).Value
            Else
                If max < Lookup_Range.Cells(ct, 1).Value Then
                    max = Lookup_Range.Cells(ct, 1).Value
                End If
            End If
        End If
    Next
    MAXAIF = max
End Function

<强>更新

根据反馈,显然这里需要返回附有最大日期的id以及日期。以下是适应该功能的功能。如果最后一个参数设置为true,则返回id;如果设置为false,则返回最大日期。

Function IdWithGreatestDate(ByVal id As Range, ByVal Criteria_Range As Range, ByVal Lookup_Range As Range, return_id As Boolean)
    Dim max
    Dim max_index
    Dim ct As Integer
    For Each cell In id
        For ct = 1 To Criteria_Range.Cells.Count
            If max = Empty Then
                max_index = ct
                max = Lookup_Range.Cells(ct, 1).Value
            Else
                If max < Lookup_Range.Cells(ct, 1).Value Then
                    max_index = ct
                    max = Lookup_Range.Cells(ct, 1).Value
                End If
            End If
        Next
    Next
    If return_id Then
        IdWithGreatestDate = Criteria_Range(max_index, 1).Value
    Else
        IdWithGreatestDate = Lookup_Range(1, max_index).Value
    End If
End Function

答案 2 :(得分:0)

您可以使用MAX()IF()函数查找ID1,ID2,ID3,ID3列中每个ID的max_date,然后再次使用MAX()查找4个值中的max_date < / p>

为每个ID选择max_date(使用CTRL + SHIFT + ENTER输入):

{MAX(IF(A3:A100=H3,F3:F100))}

在4个max_date:

中选择max_date
{=MAX(MAX(IF(A3:A100=H3,F3:F100)),MAX(IF(A3:A100=I3,F3:F100)),MAX(IF(A3:A100=J3,F3:F100)),MAX(IF(A3:A100=K3,F3:F100)))}

然后使用MATCH() | INDEX()函数查找具有max_date

的ID
=INDEX(A:A,MATCH(L3,F:F,0))