我有两个数据集:Data-A和Data-B。
数据-A
A B C D Start_Date End_Date
N C P 1 23-05-2015 27-05-2015
N C K 1 30-05-2015 07-06-2015
N C Ke 1 09-06-2015 28-06-2015
N C Ch 1 14-07-2015 25-07-2015
N C Th 1 29-06-2015 13-07-2015
N C Po 2 23-05-2015 27-05-2015
N C Kan 2 30-05-2015 08-06-2015
数据-B
X D Date A B C
444 1 09-07-2015
455 1 20-07-2015
1542 1 28-06-2015
2321 1 21-07-2015
2744 1 01-07-2015
7455 2 25-05-2015
12454 2 02-06-2015
18568 2 24-05-2015
28329 2 03-06-2015
28661 2 31-05-2015
值是数据 - Bare缺失,我需要使用条件索引匹配/ vlookup填充它们,以便列D(Data-B)与Date(Data-B)
匹配,以便Start Date<= Date <=End Date.
期望输出:
X D Date A B C
444 1 09-07-2015 N C Th
455 1 20-07-2015 N C Ch
1542 1 28-06-2015 N C Ke
2321 1 21-07-2015 N C Ch
2744 1 01-07-2015 N C Th
7455 2 25-05-2015 N C Po
12454 2 02-06-2015 N C Kan
18568 2 24-05-2015 N C Po
28329 2 03-06-2015 N C Kan
28661 2 31-05-2015 N C Kan
答案 0 :(得分:1)
概念证明
为了实现上述目的,我使用了AGGREGATE function。这是一个执行数组计算的常规公式。以下公式将返回与您的条件匹配的第一行的结果。
=INDEX(A$2:A$8,AGGREGATE(15,6,ROW($D$2:$D$8)/(($J2=$D$2:$D$8)*($E$2:$E$8<=$K2)*($K2<=$F$2:$F$8)),1)-1)
这假设您的表Data-A在A1中开始并包含1行作为标题行。公式可以放在Data-B中A下的第一个单元格中,并根据需要向下和向右复制。
聚合函数在其括号内为某些子函数执行数组计算。大约有19种不同的子功能。子功能14和15都是阵列计算。这是一个很好的功能,因为它是一个像常规公式一样的数组。
由于我希望第一行符合您的条件,因此我选择使用小函数或子函数15作为第一个参数。基本上我告诉聚合函数生成一个列表并按升序排序。
第二个参数的值为6,它告诉聚合忽略生成错误的数组的任何结果。如果我们能够做出我们不希望错误的结果,这将非常方便。
现在我们进入公式的数组部分。您可以采用等式的下一部分并突出显示相邻列中的相应行,并将其输入为 CONTROL + SHIFT + ENTER ( CSE)公式。只要在顶部单元格中执行此操作,数组公式就会传播到所选单元格的其余部分,并显示数组的结果。同时检查公式栏以查看公式周围是否出现{}。您无法手动添加{}。
{=ROW($D$2:$D$8)/(($J2=$D$2:$D$8)*($E$2:$E$8<=$K2)*($K2<=$F$2:$F$8))}
这将确定当前行,然后将其除以我们条件的结果。您也可以按照上述相同的方式在单独的列中作为CSE公式尝试以下每个条件,以查看其结果。
($J2=$D$2:$D$8)
($E$2:$E$8<=$K2)
($K2<=$F$2:$F$8)
这些会在检查每一行时为您提供TRUE或FALSE。现在有趣的是,这适用于excel公式,当您对布尔值执行数学运算时,它会将0视为false,将其他任何数字视为TRUE。它实际上会将TRUE转换为1.您还会注意到每个逻辑检查都用*分隔。在这种情况下,*就像AND运算符一样,只有当所有结果都为真时才会得到1的答案。(+将像OR运算符一样)
现在如果你记得早些时候6说过要忽略所有的错误。因此,任何不符合我们的逻辑检查的行都将导致除以0,因为并非所有逻辑检查都会导致TRUE或1.所有检查结果都会被忽略。所以现在这样做之后,只有满足我们标准的行号列表才会留在聚合数组中。
逻辑检查后,下一个参数有1,1。在这种情况下,我们告诉聚合返回列表中的第一个数字,它是符合我们标准的第一个行号。如果我们想要第三个数字,那就是3,而不是。
因此聚合返回我们想要的结果的第一行数。当它与INDEX函数配对时,何时可以使用结果告诉我们要查看INDEX函数的哪一行。在这种情况下,我们说我们想查看索引A $ 2:A $ 8。聚合函数告诉我们索引中有多少行。如果索引从第1行开始,我们就不必做任何事情。但由于有一个标题行,我们需要通过减去头行的1来调整聚合函数的结果(实际上你需要减去数据开头之上的行号)。这就是你在聚合函数之后看到-1的原因。
现在,如果你注意范围内的锁定,你会注意到我没有把A锁定在A $ 2:A $ 8。我这样做是为了让我可以将公式复制到右边,列A地址会像我一样更新。这只能起作用,因为您保持列的顺序相同。如果订单已更改,我会将索引从1D数组更改为2D数组,并使用MATCH函数排列列标题。