排除不符合excel中两个或多个条件的值

问题描述 投票:0回答:1

我有一张这样的桌子:

数字 姓名 日期
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(选择开始日期之后的日期),它无法正常工作。

excel vlookup lookup multiple-conditions index-match
1个回答
1
投票

基本上纳入条件是:

  • 查找表中存在名字(表2)
  • 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))))
© www.soinside.com 2019 - 2024. All rights reserved.