我有一张这样的桌子:
数字 | 姓名 | 日期 |
---|---|---|
1 | 乔 | 10.12.2021 |
2 | 马克 | 10.14.2021 |
3 | 乔 | 11.16.2021 |
4 | 马克 | 12.15.2021 |
5 | 安娜 | 11.12.2021 |
6 | 乔 | 12.20.2021 |
我想从表中排除所有不符合标准(在这种特殊情况下为 2 标准)的行形成第二个表(表 1 中开始日期之前的名称和日期):
数字 | 姓名 | 开始日期 |
---|---|---|
1 | 乔 | 10.22.2021 |
2 | 马克 | 11.30.2021 |
结果我应该将表 3 的名称排除在第 1 行和第 2 行(因为乔和马克在表 1 中的日期之后开始,所以名称匹配,但日期不匹配)并排除第 5 行(因为安娜不在表中2,因此名称不匹配)并且在不匹配条件的行中具有 N/A 值(或与名称不同的任何其他值):
数字 | 姓名 | 日期 | 结果 |
---|---|---|---|
1 | 乔 | 10.12.2021 | 不适用 |
2 | 马克 | 10.14.2021 | 不适用 |
3 | 乔 | 11.16.2021 | 乔 |
4 | 马克 | 12.15.2021 | 马克 |
5 | 安娜 | 11.12.2021 | 不适用 |
6 | 乔 | 12.20.2021 | 乔 |
我认为可以使用 INDEX MATCH:
{=INDEX(range1,MATCH(1,(A1=range2)*(B1=range3),0))}
但是,由于某种原因,如果我将 B1>=range2(选择开始日期之后的日期),它无法正常工作。
基本上纳入条件是:
Date >= Start Date
在
I2
单元格中使用以下公式:
=LET(matchNames,ISNUMBER(XMATCH(B2:B7,F3:F4)),
matchDates,MAP(B2:B7,C2:C7,
LAMBDA(a,b,IF(IFERROR(VLOOKUP(a,F3:G4,2,FALSE),b+1)<=b,TRUE, FALSE))),
FILTER(B2:C7,matchNames*matchDates)
)
注意:你可以在最后找到这个公式的简化版本。
这是输出:
我们使用
LET
函数先判断条件,所以我们有一个简化的FILTER
函数。
记住
include
的FILTER(array,include)
输入参数是一个Boolean数组其高度或宽度与array
相同。
matchNames,ISNUMBER(XMATCH(B2:B7,F3:F4))
XMATCH
在匹配的情况下返回第二个输入参数的索引位置,否则#N/A
,但是我们需要一个布尔值,所以我们使用ISNUMBER
将结果转换为TRUE/FALSE
。
中间结果为:
TRUE
TRUE
TRUE
TRUE
FALSE -> Anna was not found
TRUE
matchDates,MAP(B2:B7,C2:C7,
LAMBDA(a,b,
IF(IFERROR(VLOOKUP(a,F3:G4,2,FALSE),b+1)<=b,TRUE,FALSE)))
我们通过
MAP
函数构建一个与前两个输入参数大小相同的新数组。我们调用 LAMBDA
函数来比较前两个输入参数的每一行的 Date
和 Start Date
。所以a
是名字,b
是相应的日期。
我们使用
VLOOKUP
在查找数组 (a
) 中查找给定名称 (F3:G4
) 的相应开始日期。如果开始日期早于或等于日期 (b
),我们返回 TRUE
否则 FALSE
.
我们需要处理找不到名字(
a
)的情况。如果发生这种情况,VLOOKUP
返回 #N/A
,但我们需要一个布尔值,所以如果是这种情况,我们使用 always FALSE
的条件,即 b+1<=b
。请记住,在 Excel 中日期表示为正数,因此 b+1
是第二天。例如,当名字是Anna
时,就会发生这种情况。
MAP
的输出将是:
FALSE
FALSE
TRUE
TRUE
FALSE -> Anna was not found
TRUE
查看MAP规范以获取有关此功能如何工作的更多信息。
现在我们拥有构建我们
FILTER
的所有元素:
FILTER(B2:C7,matchNames*matchDates)
将两个布尔数组相乘确保满足两个条件。
您可能已经注意到布尔数组
matchDates
通过VLOOKUP
还检查名称是否存在于查找表中,因此我们不需要matchNames
条件所以初始公式可以简化如下:
=LET(matchDates,MAP(B2:B7,C2:C7,LAMBDA(a,b,
IF(IFERROR(VLOOKUP(a,F3:G4,2,FALSE),b+1)<=b,TRUE,FALSE))),
FILTER(B2:C7,matchDates)
)
或删除
LET
功能,因为此时它并不是真正必要的:
=FILTER(B2:C7,MAP(B2:B7,C2:C7,
LAMBDA(a,b,IF(IFERROR(VLOOKUP(a,F3:G4,2,FALSE),b+1)<=b,TRUE,FALSE))))