Excel数组查找
我有一个有一些id的excel行。 我想从下面第二张表的第一个表中查找id,并获取最大date的id。 输出只能来自表1中行中的id。
作为参考,“ID1”在单元格A1中,“ID”在单元格A4中。
我在这里发布了一个类似的问题,但我的要求改变了,想再次发布。 @rwilson在之前的文章中给了我一个有用的创造性的公式,但我没有表明在表2中会有重复。在下面的表2中,“b”出现了两次,但是具有不同的date。 下面的示例行数据的公式输出应该是“b”,因为它具有最大date。 我无法以任何方式对表格进行sorting,因为我无法控制它。 我需要引用它输出最新的date的id。
ID1 ID2 ID3 ID4 id of maxdate bac #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。 原因是该指数是基于最大date。 由于最大date出现在d中,因此默认情况下,索引输出d。 有没有办法告诉索引/匹配只对表1中出现的ID的索引/匹配?
ID1 ID2 ID3 ID4 id of maxdate bac #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))
UPDATE#2这是基于@ XOR公式的输出。 这是一个不起作用的情况。
ID1 ID2 ID3 ID4 id of maxdate bad #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
=IF(SUMPRODUCT(COUNTIF(A2:C2,A5:A9)),LOOKUP(1,0/FREQUENCY(0,1/(1+(B5:B9=AGGREGATE(14,6,B5:B9/(COUNTIF(A2:C2,A5:A9)>0),1)))),A5:A9),"No Matching ID")
顺便说一下,如果两个或多个ID共享最大date并且出现在Table1中,则不指定哪个应该是首选?
问候
编辑 :
如果以数组公式formsinput(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))
它基于重复以下公式,该公式find单元格A2中条目的最大date(如果作为数组公式input):
=MAX(IF($A$4:$A$8=A2,$B$4:$B$8,0))
用Ctrl + Shift + Enter(数组公式)input。
结合几次,然后做一个INDEX()
/ MATCH()
查找,你可以得到ID。 你需要弄清楚如何处理相等的最高date。
我总是使用我称之为MAXAIF的function。 您可以将其添加到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
UPDATE
根据反馈,显然这里需要返回带有最大date的id以及date。 以下是一个将适应这个function。 如果最后一个参数设置为true,则返回该id,而如果设置为false,则返回最大date。
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
您可以使用MAX()
和IF()
函数为列ID1,ID2,ID3,ID3中的每个ID查找max_date,然后再次使用MAX()
来查找4个值中的max_date
为每个IDselectmax_date(使用CTRL + SHIFT + ENTERinput):
{MAX(IF(A3:A100=H3,F3:F100))}
SELECT max_date中的4个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()
MATCH() | INDEX()
函数查找具有max_date的ID
=INDEX(A:A,MATCH(L3,F:F,0))